Для людей, работавших 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
1 | if ( substr ( $domain , 0, 4 ) == 'www.' ) |
Заменяем на
1 | if ( substr ( $domain , 0, 4 ) == 'www.' && $domain != 'www.' .DOMAIN_CURRENT_SITE) |
Таким образом, www для основного домена обрезаться не будет.
Строка ~ 119
1 | $current_blog = $wpdb ->get_row( $wpdb ->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s " , $domain ) ); |
Заменяем на
1 | $current_blog = $wpdb ->get_row( $wpdb ->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s OR domain = %s" , $domain , 'www.' . $domain ) ); |
Строка ~ 140
1 | $current_blog = $wpdb ->get_row( $wpdb ->prepare( "SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s" , $domain , $path ) ); |
Заменяем на
1 | $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
1 2 | RewriteCond %{HTTP_HOST} ^example.com$ RewriteRule (.*) http://www.example.com/$1 [L,R=301] |
Шаг 4. Домен-ошибка
В файле wp-config.php рекомендую указать такую строку:
1 |
Шаг 5. Тестирование.
После вышеприведённых операций мой сайт на WordPress MU стал легко и просто работать с www-доменами. Надеюсь, Вы догадались перед всем этим концертом сделать бэкап? ;)
P.S.: оглядывая ещё раз все пункты, мне начинает казаться, что работает это только благодаря странной магии, ибо сами действия лишены смысла. Буду благодарен тому, кто найдёт более красивое решение проблемы.
P.P.S.: «И всё таки она вертится!» на сайте http://www.fld.av13.ru без проблем =)