Ich versuche dies auf einer eigenständigen WP -Installation (nicht auf mehreren Sites). Was ich versuche zu erreichen, ist:
domain.com
auf usermeta. (erledigt)company
. Auf welche standardmäßig zugegriffen werden kann original.com/company/example-company
(erledigt - standardmäßig)domain.com/company/example-company
verfügbar zu machen, wenn die usermeta domain
gesetzt ist.Ich verstehe, dass DNS und Domain auf die aktuelle WP Installation (irrelevant) verweisen sollten, aber nicht sicher sind, wie die Domain einem Permalink zugeordnet werden soll.
Algorithmus sollte so etwas sein
company
CPT-Einzelseite angezeigt wird.domain
festgelegt ist, ändern Sie den Permalink.Wenn Sie domain.com
als Alias von original.com
festlegen, müssen Sie in WordPress nichts tun, damit es funktioniert.
Das Problem ist das Land: Sobald in DNS die 2 Domains Aliase sind, wird jede URL von WordPress über benutzerdefinierte Domains erreichbar sein: domain.com/any/wp/url
, aber auch domain2.com/any/wp/url
, domain3.com/any/wp/url
und so weiter ...
Also, was Sie tun müssen, ist
Nehmen wir an, Sie speichern Ihre ursprüngliche Domain in einer Konstanten, vielleicht in wp-config.php
.
define('ORIGINAL_DOMAIN', 'original.com');
jetzt können Sie den oben beschriebenen Workflow einfach implementieren:
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');
}
}
Schreiben wir nun eine Funktion, um Anfragen mit der aktuellen URL, aber mit der ursprünglichen Domain umzuleiten
/**
* 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();
}
Als letztes müssen Sie die Permalink-Erstellung filtern, um die benutzerdefinierte Domain für einzelne CPT-URLs von Unternehmen zu verwenden:
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);
}
Zu diesem Zeitpunkt haben Sie nur DNS für Ihren Server festgelegt, wobei alle benutzerdefinierten Domänen Aliase des Originals sind.
Bitte beachten Sie, dass der Code nicht getestet wurde.
Eine einfache Konstante WP_SITEURL
könnte den Trick machen. Ich habe an etwas ähnlichem gearbeitet.
Der Unterschied besteht darin, dass alle Domänen auf demselben Server gehostet wurden und auf das Stammverzeichnis verweisen.
Das Verfahren habe ich versucht -
Hat den Host mit $_SERVER['HTTP_Host']
überprüft und überprüft, ob er in der Datenbank vorhanden ist.
Wenn Sie Ihre Bedürfnisse vergleichen, können Sie Folgendes überprüfen:
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.
Als nächstes definiert WP_SITEURL
und 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;
Alle Links wurden dynamisch auf die aktuelle Host-Adresse geändert, und alle waren wie eine allgemeine WordPress-Site zugänglich.