Mappatura di domini su permalink (non multisito)


8

Sto provando a farlo su un'installazione WP autonoma (non multisito). Quello che sto cercando di ottenere è:

  1. L'utente salva domain.comsu usermeta. (fatto)
  2. L'utente crea un nuovo CPT, diciamo company. Che è accessibile via per impostazione predefinita original.com/company/example-company(fatto - per impostazione predefinita)
  3. Ho bisogno di tutti i post creati dall'utente per renderli disponibili anche tramite domain.com/company/example-companyl'impostazione di usermeta domain.

Comprendo che il DNS e il dominio dovrebbero essere indirizzati all'installazione WP corrente (irrilevante), ma non sono sicuro di come mappare il dominio a un permalink.

L'algoritmo dovrebbe essere qualcosa del genere

  1. Controlla se companyviene visualizzata la pagina singola CPT.
  2. Controlla se l'autore ha impostato un dominio.
  3. Se domainimpostato, modificare il permalink.

Risposte:


4

Se imposti domain.comcome alias di original.com, in WordPress non devi fare nulla per farlo funzionare.

Il problema è il paese: una volta in DNS i 2 domini sono alias, ogni URL del tuo WordPress sarà accessibile tramite domini definiti dall'utente :, domain.com/any/wp/urlma anche domain2.com/any/wp/url, domain3.com/any/wp/urle così via ...

Quindi, quello che devi fare è

  1. Controlla se l'URL è uno del dominio definito dall'utente
  2. In tal caso, controlla se la pagina richiesta è un CPT singolare e il suo autore è quello che ha salvato il dominio
  3. In caso contrario, reindirizzare la richiesta al dominio originale

Supponiamo che tu salvi il tuo dominio originale in una costante, magari dentro wp-config.php

define('ORIGINAL_DOMAIN', 'original.com');

ora puoi facilmente implementare il flusso di lavoro sopra descritto:

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

Ora scriviamo una funzione per reindirizzare la richiesta usando l'URL corrente, ma con dominio originale

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

L'ultima cosa da fare è filtrare la creazione di permalink per utilizzare il dominio definito dall'utente per gli URL CPT della singola azienda:

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

A questo punto, hai impostato DNS solo per il tuo server, dove tutti i domini definiti dall'utente sono alias dell'originale.

Si prega di notare che il codice non è testato.


4

Una semplice costante WP_SITEURLpotrebbe fare il trucco. Ho lavorato su qualcosa di simile ad esso.

La differenza è che tutti i domini sono stati ospitati sullo stesso server e hanno puntato alla directory principale.

La procedura che ho provato -

Controllato l'host utilizzando $_SERVER['HTTP_HOST']e convalidato se esiste nel database.
Confrontando le tue esigenze, puoi verificarlo come -

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.

Successivamente, definito WP_SITEURLeWP_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;

Quindi, tutti i collegamenti sono cambiati dinamicamente nell'indirizzo host corrente e tutti erano accessibili come un sito wordpress generale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.