Если вы установите domain.com
в качестве псевдонима original.com
, в WordPress вам ничего не нужно делать, чтобы это работало.
Проблема заключается в countrary: один раз в DNS на 2 доменах псевдонимов, каждый URL вашего WordPress будет доступен через определяемый пользователь домены: domain.com/any/wp/url
, но также domain2.com/any/wp/url
, domain3.com/any/wp/url
и так далее ...
Итак, что вы должны сделать, это
- Проверьте, является ли URL одним из определенных пользователем доменов.
- Если это так, проверьте, является ли запрашиваемая страница единственным CPT, и ее автор сохранил домен.
- Если нет, перенаправьте запрос на исходный доменù
Давайте предположим, что вы сохраняете свой оригинальный домен в константе, может быть, в wp-config.php
define('ORIGINAL_DOMAIN', 'original.com');
Теперь вы можете легко реализовать рабочий процесс, описанный выше:
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');
}
}
Теперь давайте напишем функцию для перенаправления запроса, используя текущий URL, но с оригинальным доменом
/**
* 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();
}
Последнее, что нужно сделать, - отфильтровать создание постоянной ссылки, чтобы использовать определяемый пользователем домен для отдельных CPT-ссылок компании:
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);
}
На данный момент вы установили DNS только для своего сервера, где все определенные пользователем домены являются псевдонимами оригинала.
Обратите внимание, что код не проверен.