web-dev-qa-db-de.com

Zuordnen von Domänen zu Permalinks (nicht zu mehreren Standorten)

Ich versuche dies auf einer eigenständigen WP -Installation (nicht auf mehreren Sites). Was ich versuche zu erreichen, ist:

  1. Benutzer speichert domain.com auf usermeta. (erledigt)
  2. Der Benutzer erstellt ein neues CPT, z. B. company. Auf welche standardmäßig zugegriffen werden kann 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-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

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

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

  1. Überprüfen Sie, ob die URL zu der benutzerdefinierten Domäne gehört
  2. Überprüfen Sie in diesem Fall, ob es sich bei der angeforderten Seite um ein einzelnes CPT handelt und der Autor 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');
  }
}

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.

4
gmazzap

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.

4
Shazzad