Mappage de domaines vers des permaliens (pas multisite)

8

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

  1. L'utilisateur économise domain.comsur 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(fait - par défaut)
  3. J'ai besoin de tous les messages créés par l'utilisateur pour les rendre disponibles également via domain.com/company/example-companylorsque l'utilisateur domainest défini.

Je comprends que le DNS et le domaine doivent être pointés vers l'installation actuelle de WP (non pertinent), mais je ne sais pas comment mapper le domaine sur un permalien.

L'algorithme devrait ressembler à ceci

  1. Vérifiez si une companyseule page CPT est affichée.
  2. Vérifiez si l'auteur a défini un domaine.
  3. Si domainest défini, modifiez le permalien.
Sisir
la source

Réponses:

4

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

Le problème est le contre-pays: une fois dans DNS les 2 domaines sont des alias, chaque URL de votre WordPress sera accessible via des domaines définis par l'utilisateur :, domain.com/any/wp/urlmais aussi domain2.com/any/wp/url, domain3.com/any/wp/urlet ainsi de suite ...

Donc, ce que vous devez faire, c'est

  1. Vérifiez si l'URL fait partie du domaine défini par l'utilisateur
  2. Si oui, vérifiez si la page demandée est un CPT singulier et si son auteur est celui qui a enregistré le domaine
  3. Sinon, redirigez la demande vers le domaine d'origine

Supposons que vous enregistrez 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 flux de travail 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');
  }
}

Écrivons maintenant 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 permalien pour utiliser le domaine défini par l'utilisateur pour les URL CPT de sociétés individuelles:

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 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é.

gmazzap
la source
4

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

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

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

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

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_SITEURLetWP_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 ont changé dynamiquement en adresse d'hôte actuelle, et tous étaient accessibles comme un site wordpress général.

Shazzad
la source