Zuordnen von Domänen zu Permalinks (nicht Multisite)

8

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

  1. Benutzer spart domain.comauf usermeta. (erledigt)
  2. Der Benutzer erstellt beispielsweise ein neues CPT company. Welches ist über standardmäßig zugänglich original.com/company/example-company(erledigt - standardmäßig)
  3. Ich brauche alle vom Benutzer erstellten Beiträge, um sie auch über domain.com/company/example-companydas Setzen der Usermeta verfügbar zu machen domain.

Ich verstehe, dass DNS und Domain auf die aktuelle WP-Installation verweisen sollten (irrelevant), bin mir aber nicht sicher, wie die Domain einem Permalink zugeordnet werden soll.

Algorithmus sollte so etwas sein

  1. Überprüfen Sie, ob eine companyeinzelne CPT-Seite angezeigt wird.
  2. Überprüfen Sie, ob der Autor eine Domain festgelegt hat.
  3. Wenn domainfestgelegt, ändern Sie den Permalink.
Sisir
quelle

Antworten:

4

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

Das Problem ist die countrary: einmal in DNS die 2 - Domänen - Aliase sind, jeder wird URL Ihrer Wordpress über benutzerdefinierte Domains erreichbar sein: domain.com/any/wp/url, sondern auch domain2.com/any/wp/url, domain3.com/any/wp/urlund so weiter ...

Also, was Sie tun müssen, ist

  1. Überprüfen Sie, ob die URL eine der benutzerdefinierten Domänen ist
  2. Wenn ja, überprüfen Sie, ob es sich bei der angeforderten Seite um ein einzelnes CPT handelt und der Autor diejenige ist, die die Domain gespeichert hat
  3. Wenn nicht, leiten Sie die Anfrage an die ursprüngliche Domain um

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 zum Umleiten der Anforderung unter Verwendung der aktuellen URL, jedoch mit der ursprünglichen Domain

/**
 * 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);
}

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.

gmazzap
quelle
4

Eine einfache Konstante WP_SITEURLkö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 -

Überprüfte den Host mit $_SERVER['HTTP_HOST']und überprüfte, ob er in der Datenbank vorhanden ist.
Wenn Sie Ihre Bedürfnisse vergleichen, können Sie dies wie folgt ü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_SITEURLundWP_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;

Daher wurden alle Links dynamisch in die aktuelle Hostadresse geändert, und alle waren wie eine allgemeine WordPress-Site zugänglich.

Shazzad
quelle