web-dev-qa-db-fra.com

Mappage de domaines sur des liens permanents (non multisite)

J'essaie de le faire sur une installation autonome WP (non multisite). Ce que j'essaie de réaliser est:

  1. L'utilisateur enregistre domain.com sur usermeta. (terminé)
  2. L'utilisateur crée un nouveau CPT, par exemple company. Qui est accessible via par défaut original.com/company/example-company (done - par défaut)
  3. J'ai besoin de toutes les publications créées par l'utilisateur pour les rendre également disponibles via domain.com/company/example-company lorsque la variable usermeta domain est définie.

Je comprends que le DNS et le domaine doivent être pointés sur l’installation actuelle de WP (sans importance), mais ne savent pas comment mapper le domaine sur un lien permanent.

L'algorithme devrait être quelque chose comme ça

  1. Vérifiez si company page unique CPT est affichée.
  2. Vérifiez si l'auteur a défini un domaine.
  3. Si domain est défini, modifiez le permalien.
8
Sisir

Si vous définissez domain.com comme alias de original.com, dans WordPress, vous ne devez rien faire pour que cela fonctionne.

Le problème est le pays: une fois dans DNS les 2 domaines sont des alias, tous les url de votre WordPress seront accessibles via les domaines définis par l'utilisateur: domain.com/any/wp/url, mais aussi domain2.com/any/wp/url, domain3.com/any/wp/url et ainsi de suite ...

Donc, ce que vous devez faire, c'est

  1. Vérifier si l'URL est l'un des domaines définis par l'utilisateur
  2. Si tel est le cas, vérifiez si la page demandée est un CPT singulier et son auteur est celui qui a sauvegardé le domaine.
  3. Sinon, redirigez la demande vers le domaine d'origine

Supposons que vous sauvegardiez votre domaine d'origine dans une constante, peut-être dans wp-config.php

define('ORIGINAL_DOMAIN', 'original.com');

maintenant, vous pouvez facilement implémenter le workflow décrit ci-dessus:

add_action('template_redirect', 'check_request_domain', 1);

function check_request_domain() {
  $domain = filter_input(INPUT_SERVER, 'HTTP_Host', FILTER_SANITIZE_URL);
  // strip out the 'www.' part if present
  $domain = str_replace( 'www.', '', $domain);

  // if the request is from original domain do nothing
  if ( $domain === ORIGINAL_DOMAIN ) return;

  // if it is not a singular company CPT request redirect to same request
  // but on original domain
  if ( ! is_singular('company') ) {
    redirect_to_original(); // function defined below
  }

  // if we are here the request is from an user domain and for a singular company request
  // let's check if the author of the post has user meta, assuming meta key is `'domain'`
  // and the meta value is the same of domain in current url

  $meta = get_user_meta( get_queried_object()->post_author, 'domain', TRUE ); 

  if ( $meta !== $domain ) { // meta doesn't match, redirect
     redirect_to_original(); // function defined below
  } else {
    // meta match, only assuring that WordPress will not redirect canonical url
    remove_filter('template_redirect', 'redirect_canonical');
  }
}

Maintenant, écrivons une fonction pour rediriger la demande en utilisant l'URL actuelle, mais avec le domaine d'origine

/**
 * Redirect the request to same url, but using original domain
 */
function redirect_to_original() {
  $original = untrailingslashit( home_url() ) . add_query_arg( array() );
  wp_safe_redirect( $original, 301 );
  exit();
}

La dernière chose à faire est de filtrer la création de lien permanent pour utiliser le domaine défini par l'utilisateur pour les URL de société CPT singulières:

add_filter( 'post_type_link', 'custom_user_domain_plink', 999, 2 );

function custom_user_domain_plink( $post_link, $post ) {
  // we want change permalink only for company cpt posts
  if ( $post->post_type !== 'company' ) return $post_link;

  // has the user setted a custom domain? If not, do nothing
  $custom = get_user_meta( $post->post_author, 'domain', TRUE );
  if ( empty($custom) ) return $post_link;

  // let's replace the original domain, with the custom one, and return new value
  return str_replace( ORIGINAL_DOMAIN, $custom, $post_link);
}

À ce stade, vous avez uniquement défini le DNS pour votre serveur, où tous les domaines définis par l'utilisateur sont des alias de l'original.

Veuillez noter que le code n'a pas été testé.

4
gmazzap

Une simple constante WP_SITEURL pourrait faire l'affaire. J'ai travaillé sur quelque chose de similaire.

La différence est que tous les domaines ont été hébergés sur le même serveur et pointés vers le répertoire racine.

La procédure que j'ai essayée -

Vérifié l'hôte à l'aide de $_SERVER['HTTP_Host'] et validé s'il existe dans la base de données.
En comparant vos besoins, vous pouvez vérifier ceci comme suit:

global $wpdb;
$domain_user = $wpdb->get_var(
    "SELECT user_id FROM $wpdb->usermeta".
    " WHERE meta_key = 'domain'".
    " AND meta_value='". $_SERVER['HTTP_Host'] ."'"
);
// if an user found, do further processing. 
// Exclude posts by other user using pre_get_posts may be.

Ensuite, défini WP_SITEURL et WP_HOME

define( 'MY_SITE_DOMAIN', $_SERVER['HTTP_Host'] );
if( !defined( 'WP_SITEURL' )):
    if( is_ssl())
        define( 'WP_SITEURL', 'https://'. MY_SITE_DOMAIN );
    else
        define( 'WP_SITEURL', 'http://'. MY_SITE_DOMAIN );
endif;

if( !defined( 'WP_HOME' ) ):
    define( 'WP_HOME', WP_SITEURL );
endif;

Ainsi, tous les liens sont passés dynamiquement à l’adresse actuelle de l’hôte et sont tous accessibles comme un site wordpress général.

4
Shazzad