Zuordnen von Domains zu Permalinks (nicht Multisite)

Ich versuche, dies auf einer eigenständigen WP-Installation (nicht Multisite) zu tun. Was ich erreichen möchte, ist:

  1. Der Benutzer speichert domain.com auf usermeta. (erledigt)
  2. Benutzer erstellt ein neues CPT, sagen company . Auf das standardmäßig per Default zugegriffen werden kann: original.com/company/example-company (done – standardmäßig)
  3. Ich brauche alle vom Benutzer erstellten Posts, um sie auch über domain.com/company/example-company zur Verfügung zu domain.com/company/example-company wenn die usermeta- domain gesetzt ist.

Ich verstehe, dass der DNS und die Domäne auf die aktuelle WP-Installation (irrelevant) verweisen sollten, aber nicht sicher sind, wie die Domäne einem Permalink zugeordnet werden soll.

Algorithmus sollte so sein

  1. Überprüfen Sie, ob die CPT-Einzelseite des company angezeigt wird.
  2. Überprüfen Sie, ob der Autor eine Domain festgelegt hat.
  3. Wenn die domain ist, ändern Sie den Permalink.

Solutions Collecting From Web of "Zuordnen von Domains zu Permalinks (nicht Multisite)"

Wenn Sie domain.com als Alias ​​von original.com domain.com , müssen Sie in WordPress nichts tun, damit es funktioniert.

Das Problem ist der countrary: einmal in DNS die 2 Domains sind Aliase, jede URL von Ihrem WordPress wird ü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

  1. Überprüfen Sie, ob die URL eine der benutzerdefinierten Domänen ist
  2. Wenn dies der Fall ist, überprüfen Sie, ob die angeforderte Seite ein singuläres CPT ist und der Autor der Seite ist, die die Domain gespeichert hat
  3. Wenn nicht, leiten Sie die Anfrage an die ursprüngliche Domain weiter

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'); } } 

Lassen Sie uns jetzt eine function schreiben, um die Anfrage 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 Domäne für einzelne CPT-URLs des Unternehmens 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); } 

An diesem Punkt 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 und auf das Stammverzeichnis verwiesen wurden.

Die Prozedur, die ich versuchte –

Überprüft den Host mit $_SERVER['HTTP_HOST'] und Validiert, wenn er in der database vorhanden ist.
Vergleichen Sie Ihre Bedürfnisse, können Sie dies überprüfen wie –

 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 definieren Sie 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; 

So wurden alle Links dynamisch zur aktuellen Host-Adresse geändert, und alle waren wie eine allgemeine WordPress-Site zugänglich.