J'essaie de le faire sur une installation autonome WP (non multisite). Ce que j'essaie de réaliser est:
domain.com
sur usermeta. (terminé)company
. Qui est accessible via par défaut original.com/company/example-company
(done - par défaut)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
company
page unique CPT est affichée.domain
est défini, modifiez le permalien.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
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é.
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.