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

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

  1. O usuário salva o domain.com no usermeta. (feito)
  2. O usuário cria um novo CPT, diz a company . O que é acessível via por padrão original.com/company/example-company (feito – por padrão)
  3. Eu preciso de todas as postagens criadas pelo usuário para disponibilizar também via domain.com/company/example-company quando o domain do usermeta está configurado.

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

Algoritmo deve ser algo assim

  1. Verifique se a página única do CPT da company é exibida.
  2. Verifique se o autor definiu um domínio.
  3. Se o domain estiver configurado, modifique o permalink.

Solutions Collecting From Web of "Mapeando Domínios para Permalinks (não multisite)"

Se você definir o domain.com como um alias do original.com , no WordPress você não precisa fazer nada para fazê-lo funcionar.

O problema é o countrary: uma vez que no DNS os 2 domínios são alias, cada URL do seu WordPress será acessível 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ê tem que fazer, é

  1. Verifique se o url é um dos domínios definidos pelo usuário
  2. Se assim for, verifique se a página solicitada é um CPT singular e seu autor é aquele que salvou o domínio
  3. Caso contrário, 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 facilmente implementar o stream 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 function para redirect a solicitação usando 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 de permalink para usar o domínio definido pelo usuário para URL simples 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ê configurou somente DNS para o seu servidor, onde todos os domínios definidos pelo usuário são alias do original.

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

Uma constante constante WP_SITEURL poderia fazer o truque. Eu trabalhei em algo semelhante a ele.

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

O procedimento que eu tentei –

Verificou o host usando $_SERVER['HTTP_HOST'] e validado se ele existir no database.
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, definiu 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; 

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