Asignación de dominios a enlaces permanentes (no multisitio)

8

Estoy tratando de hacer esto en una instalación WP independiente (no multisitio). Lo que estoy tratando de lograr es:

  1. El usuario guarda domain.comen usermeta. (hecho)
  2. El usuario crea un nuevo CPT, por ejemplo company. A la que se puede acceder de forma predeterminada original.com/company/example-company(hecho - por defecto)
  3. Necesito que todas las publicaciones creadas por el usuario estén disponibles también a través de domain.com/company/example-companycuando domainse configura el usuario .

Entiendo que el DNS y el dominio deben apuntar a la instalación actual de WP (irrelevante), pero no estoy seguro de cómo asignar el dominio a un enlace permanente.

Algoritmo debería ser algo como esto

  1. Compruebe si companyse muestra una sola página CPT.
  2. Compruebe si el autor estableció un dominio.
  3. Si domainestá configurado, modifique el enlace permanente.
Sisir
fuente

Respuestas:

4

Si establece domain.comcomo un alias de original.com, en WordPress no tiene que hacer nada para que funcione.

El problema es el país: una vez en DNS, los 2 dominios son alias, cada URL de su WordPress será accesible a través de dominios definidos por el usuario: domain.com/any/wp/urlpero también domain2.com/any/wp/url, domain3.com/any/wp/urly así sucesivamente ...

Entonces, lo que tienes que hacer es

  1. Compruebe si la url es uno de los dominios definidos por el usuario
  2. Si es así, verifique si la página solicitada es un CPT singular y su autor es el que guardó el dominio
  3. Si no, redirija la solicitud al dominio original.

Supongamos que guarda su dominio original en una constante, tal vez en wp-config.php

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

ahora puede implementar fácilmente el flujo de trabajo descrito anteriormente:

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

Ahora escribamos una función para redirigir la solicitud usando la URL actual, pero con el dominio original

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

Lo último que debe hacer es filtrar la creación de enlaces permanentes para usar el dominio definido por el usuario para urls CPT de empresas singulares:

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

En este punto, solo ha configurado DNS para su servidor, donde todos los dominios definidos por el usuario son alias del original.

Tenga en cuenta que el código no se ha probado.

gmazzap
fuente
4

Una constante simple WP_SITEURLpodría hacer el truco. Trabajé en algo similar.

La diferencia es que todos los dominios estaban alojados en el mismo servidor y apuntaban al directorio raíz.

El procedimiento que probé

Comprueba el host usando $_SERVER['HTTP_HOST']y Validado si existe en la base de datos.
Comparando sus necesidades, puede verificar esto como:

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.

A continuación, definido WP_SITEURLyWP_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;

Entonces, todos los enlaces cambiaron dinámicamente a la dirección de host actual, y todos fueron accesibles como un sitio general de WordPress.

Shazzad
fuente