Для людей, работавших 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. База данных.
Прежде всего, нам требуется настроить параметры в самой базе данных. Если попытаться сделать это прямо из сайта, возникнет проблема — циклическое перенаправление не даст нам возможность работать с самим сайтом.
- Таблица wp_blogs — заменяем значение поля domain у блога под номером 1 с example.com на www.example.com
- Таблица wp_1_options — заменяем option_value с http://example.com на http://www.example.com у строк с option_name параметром home и siteurl
- В таблице 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 без проблем =)