Mapeando Domínios para Permalinks (não multisite)

8

Estou tentando fazer isso em uma instalação autônoma do WP (não em vários sites). O que estou tentando alcançar é:

  1. O usuário salva domain.com no usermeta. (feito)
  2. O usuário cria um novo CPT, digamos company . Qual é acessível via por padrão original.com/company/example-company (feito - por padrão)
  3. Preciso que todas as postagens criadas pelo usuário também sejam disponibilizadas via domain.com/company/example-company quando o usermeta domain estiver definido.

Eu entendo que o DNS e o domínio devem ser apontados para a instalação atual do WP (irrelevante), mas não tenho certeza de como mapear o domínio para um permalink.

Algoritmo deve ser algo assim

  1. Verifique se a página única company CPT é exibida.
  2. Verifique se o autor definiu um domínio.
  3. Se domain estiver definido, modifique o link permanente.
por Sisir 10.02.2014 / 09:14

2 respostas

4

Se você definir domain.com como um alias de original.com , no WordPress você não precisará fazer nada para que funcione.

O problema é o país: uma vez no DNS os 2 domínios são aliases, todos os URLs do seu WordPress estarão acessíveis através de domínios definidos pelo usuário: domain.com/any/wp/url , mas também domain2.com/any/wp/url , domain3.com/any/wp/url e assim por diante ...

Então, o que você precisa fazer é

  1. Verifique se o URL é um dos domínios definidos pelo usuário
  2. Em caso afirmativo, verifique se a página solicitada é um CPT singular e seu autor é o que salvou o domínio
  3. Se não, redirecione a solicitação para o domínio original

Vamos supor que você salve seu domínio original em uma constante, talvez em wp-config.php

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

agora você pode implementar facilmente o fluxo de trabalho descrito acima:

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

Agora vamos escrever uma função para redirecionar a solicitação usando o URL atual, mas com o domínio 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();
}

A última coisa a fazer é filtrar a criação do permalink para usar o domínio definido pelo usuário para URLs de CPT da empresa:

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

Neste ponto, você só configurou o DNS para o seu servidor, onde todos os domínios definidos pelo usuário são aliases do original.

Por favor, note que o código não foi testado.

    
por gmazzap 10.02.2014 / 16:31
4

Uma constante simples WP_SITEURL poderia fazer o truque. Eu trabalhei em algo parecido com isso.

  

A diferença é que todos os domínios foram hospedados no mesmo servidor   e apontou para o diretório raiz.

O procedimento que tentei -

Verificou o host usando $_SERVER['HTTP_HOST'] e validado se ele existe no banco de dados.
Comparando suas necessidades, você pode verificar isso 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.

Em seguida, defina WP_SITEURL e 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;

Assim, todos os links mudaram dinamicamente para o endereço do host atual, e todos eles eram acessíveis como um site wordpress geral.

    
por Shazzad 10.02.2014 / 16:21