Есть ли способ исключить домен из генерации ссылок в WordPress - PullRequest
3 голосов
/ 13 августа 2010

У меня есть сайт, который отвечает на * .domain.com.

Переход на x.domain.com или y.domain.com должен привести к созданию той же веб-страницы.

Что * я не знаю, но это важная часть информации, так как мы отслеживаем вещи на ее основе.

При переходе на WordPress мы столкнулись с довольно серьезной проблемой. Похоже, генерировать ссылки (используя get_page_link) с доменом, который установлен в администраторе.

Это не будет работать для нас, потому что мы не можем найти способ сказать WordPress генерировать ссылки без домена (почему он это делает в любом случае ?!), и каждый раз, когда нажимается ссылка, браузер выходит из: * до domain.com (так как domain.com - это то, что мы имеем в админе).

Ответы [ 2 ]

7 голосов
/ 13 августа 2010

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

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

WP_HOME and WP_SITEURL in WordPress Admin Console

Вы можете спросить, в чем разница между двумя 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

1 голос
/ 13 августа 2010

есть ли у вас контроль над вашим хостингом? Возможно, вы можете использовать модуль перезаписи в apache, если вы используете apache.

В httpd.conf добавьте:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^x\.domain\.com
RewriteRule ^(.*)$ http://www.domain.com/x/$1
RewriteCond %{HTTP_HOST} ^y\.domain\.com
RewriteRule ^(.*)$ http://www.domain.com/y/$1

Вы также можете изменить способ передачи переменной "v"

RewriteRule ^(.*)$ http://www.domain.com/$1&var=v

Я не пробовал код, но я уверен, что, по крайней мере, он откроет ваш разум для нового способа решения этой проблемы - такого, который не требует много кода.

Приветствие.

A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...