WordPress MU и битва с www

Опубликовано 21.02.2010 в 18:11 в разделе ,

Для людей, работавших  WordPress MU, не будет секретом тот факт, что адрес основного блога в WordPress всегда должен быть записан без «www» в начале. Существует хак, позволяющий обойти это неприятное ограничение многопользовательского WordPress и порадовать тех, кого эстетически привлекает три дабл-ю в начале адреса сайта.

Возможно, существует гораздо более простой способ сделать требуемое, но увы,  на момент написания этой статьи я его не знаю, кто придумает — отпишитесь пожалуйста, буду премного благодарен.

Предположим, на сайте example.com мы хотим сделать основным адресом не собственно example.com, а www.example.com. При этом блоги третьего уровня не должны обрести адрес sub.www.example.com вместо привычного sub.example.com.

Все указания даются для WordPress MU версии 2.8.6, который я использовал на своём сайте. Тестовый сайт работает на WordPress MU 2.8.6 и BuddyPress 1.1.3 без ошибок.

Шаг 1. База данных.

Прежде всего, нам требуется настроить параметры в самой базе данных. Если попытаться сделать это прямо из сайта, возникнет проблема — циклическое перенаправление не даст нам возможность работать с самим сайтом.

  1. Таблица wp_blogs — заменяем значение поля domain у блога под номером 1 с example.com на www.example.com
  2. Таблица wp_1_options — заменяем option_value с http://example.com на http://www.example.com у строк с option_name параметром home и siteurl
  3. В таблице wp_site ни в коем случае ничего не трогаем!!

На сайт после этих изменений не заходим.

Шаг 2. Файл wpmu-settings.php

Мы должны разрешить WordPress MU воспринимать основной домен  с префиксом www, не отправляя его на домен без префикса. Для этого проведём ряд замен.

Строка ~ 9

if( substr( $domain, 0, 4 ) == 'www.')

Заменяем на

if( substr( $domain, 0, 4 ) == 'www.' && $domain != 'www.'.DOMAIN_CURRENT_SITE)

Таким образом, www для основного домена обрезаться не будет.

Строка ~ 119

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s ", $domain) );

Заменяем на

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s OR domain = %s", $domain, 'www.'.$domain) );

Строка ~ 140

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s", $domain, $path) );

Заменяем на

$current_blog = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->blogs WHERE (domain = %s OR domain = %s) AND path = %s", $domain, 'www.'.$domain, $path) );

Теперь наш сайт не боится доменов с префиксом www. Или почти не боится.

Шаг 3. Перенаправление

В файле .htaccess реализуем простое перенаправление с example.com на www.example.com

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [L,R=301]

Шаг 4. Домен-ошибка

В файле wp-config.php рекомендую указать такую строку:

define( 'NOBLOGREDIRECT', 'http://www.example.com/' ); 

Шаг 5. Тестирование.

После вышеприведённых  операций мой сайт на WordPress MU стал легко и просто работать с www-доменами. Надеюсь, Вы догадались перед всем этим концертом сделать бэкап? ;)

P.S.: оглядывая ещё раз все пункты, мне начинает казаться, что работает это только благодаря странной магии, ибо сами действия лишены смысла. Буду благодарен тому, кто найдёт более красивое решение проблемы.

P.P.S.:  «И всё таки она вертится!» на сайте http://www.fld.av13.ru без проблем =)