К сожалению, WordPress спроектирован так, что действительно трудно избавиться от доменного компонента URL-адресов. Но еще не все потеряно! Читайте дальше, так как ответ на ваш вопрос требует немного предыстории.
Команда WordPress приняла решение потребовать, чтобы пользователь сайта жестко закодировал домен сайта либо в базе данных через консоль администратора, что вы можете увидеть на следующем снимке экрана, через PHP, который мы обсудим ниже:

Вы можете спросить, в чем разница между двумя URL-адресами? Даже я нахожу это в замешательстве, потому что мне почти никогда не нужно ничего другого, чтобы они оба указывали на корневой URL-адрес, и поскольку для вашего вопроса это не важно, я просто затушевываю эту деталь. Если вам интересно, вы можете узнать больше здесь:
Продвигаясь вперед, другой вариант заключается в жестком кодировании двух PHP-констант WP_SITEURL и WP_HOME в файле /wp-config.php
, который находится в корне установки WordPress. Эти две строки могут выглядеть так в вашем /wp-config.php
файле:
define('WP_HOST','http://domain.com');
define('WP_SITEURL','http://domain.com');
Хорошая новость заключается в том, что вы можете определять их оба динамически в зависимости от текущего домена, с которого обслуживается ваш сайт (я предполагаю, что у вас есть оба DNS-сервера). и ваш веб-сервер Apache настроен на подстановочный DNS .) Вы можете использовать следующий код для сопоставления любого имени субдомена, состоящего из букв и цифр:
$root_domain = 'domain.com'; // Be sure to set this to your 2nd level domain!!!
$this_domain = $_SERVER['SERVER_NAME'];
if (!preg_match("#^([a-zA-Z0-9]+\.)?{$root_domain}$#",$this_domain)) {
echo "ERROR: The domain [$this_domain] is not a valid domain for this website.";
die();
} else {
define('WP_HOME',"http://{$this_domain}");
define('WP_SITEURL',"http://{$this_domain}");
}
плохие новости это вы можете иметь некоторые " артефакты ", с которыми вам придется иметь дело после того, как вы заработаете, например, как URL-адреса обрабатываются для URL-адресов изображений, хранящихся в содержимом базы данных (которые могут или не могут стать проблемой), или для ключей API Карт Google и т. д. Если у вас возникли проблемы с ними, позвольте мне предложить вам опубликовать еще один вопрос здесь или даже лучше на * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1049
Что касается сообщения WordPress о том, как генерировать ссылки, есть фильтры, которые вы можете " перехватить ", но в моем быстром тестировании я не думаю, что вам это нужно, потому что WordPress сгенерирует ссылки для любого домена, с которым происходит быть вашим текущим доменом. Тем не менее, если вы обнаружите, что они вам нужны, вы можете сделать это, хотя будьте готовы быть пораженными всеми необходимыми add_filter()
утверждениями! Каждый из них управляет одним из различных способов создания ссылок в WordPress.
Вот функция ловушечного фильтра и 40+ add_filter()
вызовов; вам могут не понадобиться все они, но если вы делаете здесь, они:
function multi_subdomain_permalink($permalink){
$root_domain = 'domain.com';
$this_domain = $_SERVER['SERVER_NAME'];
if (preg_match("#^([a-zA-Z0-9]+)\.?{$root_domain}$#",$this_domain,$match)) {
$permalink = str_replace("http://{$match[1]}.",'http://',$permalink);
}
return $permalink;
}
add_filter('page_link','multi_subdomain_permalink');
add_filter('post_link','multi_subdomain_permalink');
add_filter('term_link','multi_subdomain_permalink');
add_filter('tag_link','multi_subdomain_permalink');
add_filter('category_link','multi_subdomain_permalink');
add_filter('post_type_link','multi_subdomain_permalink');
add_filter('attachment_link','multi_subdomain_permalink');
add_filter('year_link','multi_subdomain_permalink');
add_filter('month_link','multi_subdomain_permalink');
add_filter('day_link','multi_subdomain_permalink');
add_filter('search_link','multi_subdomain_permalink');
add_filter('feed_link','multi_subdomain_permalink');
add_filter('post_comments_feed_link','multi_subdomain_permalink');
add_filter('author_feed_link','multi_subdomain_permalink');
add_filter('category_feed_link','multi_subdomain_permalink');
add_filter('taxonomy_feed_link','multi_subdomain_permalink');
add_filter('search_feed_link','multi_subdomain_permalink');
add_filter('get_edit_tag_link','multi_subdomain_permalink');
add_filter('get_edit_post_link','multi_subdomain_permalink');
add_filter('get_delete_post_link','multi_subdomain_permalink');
add_filter('get_edit_comment_link','multi_subdomain_permalink');
add_filter('get_edit_bookmark_link','multi_subdomain_permalink');
add_filter('index_rel_link','multi_subdomain_permalink');
add_filter('parent_post_rel_link','multi_subdomain_permalink');
add_filter('previous_post_rel_link','multi_subdomain_permalink');
add_filter('next_post_rel_link','multi_subdomain_permalink');
add_filter('start_post_rel_link','multi_subdomain_permalink');
add_filter('end_post_rel_link','multi_subdomain_permalink');
add_filter('previous_post_link','multi_subdomain_permalink');
add_filter('next_post_link','multi_subdomain_permalink');
add_filter('get_pagenum_link','multi_subdomain_permalink');
add_filter('get_comments_pagenum_link','multi_subdomain_permalink');
add_filter('shortcut_link','multi_subdomain_permalink');
add_filter('get_shortlink','multi_subdomain_permalink');
add_filter('home_url','multi_subdomain_permalink');
add_filter('site_url','multi_subdomain_permalink');
add_filter('admin_url','multi_subdomain_permalink');
add_filter('includes_url','multi_subdomain_permalink');
add_filter('content_url','multi_subdomain_permalink');
add_filter('plugins_url','multi_subdomain_permalink');
add_filter('network_site_url','multi_subdomain_permalink');
add_filter('network_home_url','multi_subdomain_permalink');
add_filter('network_admin_url','multi_subdomain_permalink');
Пока подводит нас к последнему пункту. В WordPress есть функция, которая пытается гарантировать, что каждый загруженный URL-адрес обслуживается через его canonical
URL-адрес, что в целом является наилучшей веб-практикой, особенно если вы заинтересованы в оптимизации результатов поисковой системы в Google и другие поисковые системы. Однако в вашем случае, если вы действительно не хотите, чтобы WordPress перенаправлял на ваш канонический URL-адрес, вам нужно добавить хук фильтра redirect_canonical
и сказать WordPress не делать этого.
Ниже приведен код, который гарантирует, что любая страница, которая служит в качестве «x.domain.com
», остается на «x.domain.com
», даже если все URL-адреса отфильтрованы до «domain.com
». Возможно, это не та логика, которая вам нужна, но я просто покажу вам строительные блоки WordPress, чтобы вы могли понять, какая логика вам нужна.
Несколько заключительных деталей об этом вызове функции; параметры # 3 и # 4 относятся соответственно к priority (10 является стандартным приоритетом, поэтому эта ловушка не будет обрабатываться специальным образом) и количество аргументов функции (2 аргумента $redirect_url
и $requested_url
.) Еще одна вещь, на которую следует обратить внимание: возвращение false
вместо действительного URL отменяет каноническое перенаправление:
add_filter('redirect_canonical','multi_subdomain_redirect_canonical',10,2);
function multi_subdomain_redirect_canonical($redirect_url,$requested_url){
$redirect = parse_url($redirect_url);
$requested = parse_url($requested_url);
// If the path+query is the same for both URLs, Requested and Redirect, and
if ($redirect['path']+$redirect['query']==$requested['path']+$requested['query']) {
// If Requested URL is a subdomain of the Redirect URL
if (preg_match("#^([a-zA-Z0-9]+).{$redirect['host']}$#",$requested['host'])) {
$redirect_url = false; // Then cancel the redirect
}
}
return $redirect_url;
}
Вот и все. Надеюсь, это поможет.
-Mike