Как создать зеркало сайта на WordPress (плагин)

Как создать зеркало сайта на WordPress (плагин)

Все-таки я окончательно решил уходить от доменов RU.

А потому встала задача сделать зеркала сайтов, работающих на WordPress, да таким образом, чтобы использовать одну и ту же базу данных, не меняя ее структуры и не добавляя новых таблиц.

Если бы не Яндекс, то все было бы гораздо проще — поставил бы 301-й редирект и делов-то. Но Яндекс этот редирект в упор не понимает, поэтому, чтобы все прошло гладко, для сего поисковика необходима следующая последовательность переноса сайта:

  1. Сделать абсолютную копию сайта (его зеркало) таким образом, чтобы сайт работал одновременно с двух адресов.
  2. На старом домене в robots.txt добавить директиву host, указывающую на новый адрес сайта.
  3. Ждать, ждать, ждать — когда придет робот-зеркальщик, когда его кореш индексирующий бот познакомится с зеркалом сайта, и когда проиндексированное зеркало, наконец, попадет в серп Яндекса.
  4. Вот теперь можно будет ставить 301-й редирект со старого адреса на новый.

Вы наверняка знаете, что WordPress жестко привязывает к сайту его адрес, т.е. если попытаться тупо скопировать файлы движка, находящиеся на фтп, в новый сайт и оставить то же самое подключение к БД, то при заходе по новому адресу сайта произойдет автоматический редирект на старый адрес, поскольку он и указан в настройках.

Чтобы обойти этот редирект (кстати, в более ранних версиях WordPress его не было), я создал малюсенький плагин в пару десятков строк кода, который и позволяет выполнить первый из четырех вышеуказанных пунктов.

Но, прежде чем дать ссылку на плагин, я хочу рассказать, как с ним работать.

Установка и настройка плагина

  1. Нет необходимости создавать на фтп-сервере копию сайта, т.е. будет использоваться всего одна инсталляция WordPress. Вместо этого необходимо создать зеркало домена (также их называют псевдонимом или алиасом). Т.е. новый домен необходимо сделать зеркалом старого.

    Вам самим придется разобраться, каким образом это сделать на вашем хостинге, я же только приведу пример того, как это выглядит в панели управления ISPmanager:

    Настройка зеркала домена в ISPmanager

  2. Распаковать плагин из архива и в файле AA-DomainMirror.php отредактировать следующие 2 строки:
    $main = "domain.ru"; // главный домен
    $mirror = "domain.com"; // зеркало
    
  3. Закинуть папку AA-DomainMirror на сайт и активировать плагин через админку. Обратите внимание, что название папки лучше не менять, AA- в названии используется для того, чтобы плагин инициировался первым.
  4. После этого следует походить по новому адресу сайта и удостовериться, что все ссылки содержат правильный домен. В зависимости от используемых вами плагинов может случиться так, что некоторые ссылки будут содержать старый домен. Поэтому вам самим придется разбираться с такими плагинами.

Скачать плагин

Проверял работу плагина на WordPress 2.7, думаю, что и на 2.8 и на некоторых ранних версиях тоже будет работать.

Надеюсь, кому-то этот плагин пригодится =)

Комментарии (75)
  1. 1
    @

    А как блог на блогспоткоме сделать зеркалом нового блога на домене ру?

  2. 3
    @

    Спасибо за замечательный плагин. Сначала правда перепутал зеркало с основным))

  3. 4
    simiris
    @

    Спасибо за полезную информацию.
    Правильно ли я понимаю, что физически при этом данные будут располагаться только в одном месте, т.е. на основном сайте, и если по какой-то причине физически будут разрушены данные на основном сайте, то не будет данных и на второстепенном-зеркале?
    Если нет, то поясните, пожалуйста, копируются ли автоматически на зеркало файлы картинок, загружаются ли файлы, которые загружены на основной сайт (файлы для скачивания посетителями) и т.п.?

  4. 6
    lex111

    Меня интересует такой вопрос, как сделать зеркало сайта без редиректа? Ну тоесть чтобы сайт был доступен по обоим адресам, вот например этот сайт(не реклама) http://podkat.vokar.net/ (Линк сети MaxNet) http://podkat.ru/ и http://podkat.flyfm.net/ он доступен до 3 адресам без редиректа как так сделать?

  5. 8
    Дима
    @

    Сделал как написано все заработало но потом надо стало поменять домены местами так как один из них кириллический.
    Я перенес WP на другой домен третьим способом указанным тут: http://dimox.name/moving-the-site-on-new-domain/ и в итоге зеркало открывается но все ссылки постов ведут на основной домен, а не зеркало.
    Как вылечить?

  6. 9
    pikan

    Как сделать так чтобы с главного домена перенаправлять на новый с www.test.com/add автоматом на www.test.ru/add ?

  7. 11

    Димокс, а после всех переносов уже прошло около полугода — я могу удалить плагин? я просто плохо понимаю систему..)) у меня не заглючит вордпресс после удаления?

  8. 13
    @

    Спасибо, хорошее решение. Ведь 301-редирект это неправильное решение для переноса траста и возроста на новый домен. Для этого должно быть два одинаковых зеркала.

  9. 14
    @

    Правда есть один небольшой вопрос, скажем делаем мы зеркало сайта, после того как два сайта стали зеркалами, до 301-го редиректа, это надо все таки на новый домен залить весь сайт и в базе указать урлы нового сайта?

  10. 15
    Джус
    @

    спасибо огромное за плагин! очень помогло при необходимости создать один сайт с несколькими доменами… надеюсь, это не повлечет проблем с поисковиками…

  11. 16
    @

    Есть основной сайт, тот что в подписи, и есть свободный домен d-nk.in.ua
    Как сделать правильно и корректно d-nk.in.ua зеркалом сайта d-nk.com.ua
    Что бы и информация с основного перетекала на зеркало и поисковики не путались где основной, а где зеркало.
    Спасибо

  12. 17
    Леонид
    @

    Здравствуйте!
    Сделал всё, как сказано. Пока ничего не работает ((

  13. 18
    Юрий

    Здравуствуйте.
    Плаг рабочий.
    Можно его дописать, чтобы зеркал было несколько?
    Сейчас только 1 домен можно указать.

  14. 19
    Юрий

    $main = «abc.ru»; // главный домен
    $mirrors = array(«abc1.ru», «abc2.ru»); // зеркала
    $mirror = «abc1.ru»; // зеркало
    if ( in_array($_SERVER[‘SERVER_NAME’], $mirrors) )
    $mirror = $_SERVER[‘SERVER_NAME’];

    Вот так всё просто.

  15. 20
    Дмитрий

    Привет.
    А как сделать чтобы сайт открывался в двух разных протоколах и в http и в https ?
    Вордпресс позволяет использовать только какой то один из них, который указан в настройках, и на него идёт редирект, вот мне надо сделать чтобы редиректа не было

  16. 21
    Юрий

    Согласен с Дмитрием.
    Такая необходимость не часто, но нужна. например при переезде сайта на https, сайт должен открываться по обоим протоколам сразу.

  17. 22

    Спасибо за полезную информацию.Буду иметь ввиду.

  18. 23
    Александр
    @

    Столько лет прошло с момента публикации этой статьи, а в рунете ничего нового в этом плане никто не создал. Нашел только перепечатки данной статьи да ссылки на нее))
    Но суть не в этом. Тема актуальна и сегодня. Вот заказчик решил сделать зеркало для своего сайта, чтобы сайт и все его страницы открывались по двум доменам. Установил ваш плагин. И все работает хорошо. Но только на внутренних страницах. А на главной странице происходит редирект на главный домен, который прописан в админке в качестве адреса сайта. Может, это связано с модификациями Вордпресс? Или 9 лет назад тоже такая же картина была. Можно ли решить эту задачу для последних версий Вордпресс? Спасибо!

    • 24

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

      • 25
        Александр
        @

        Жаль, конечно. И все же спасибо большое за плагин!

        • 26
          @

          Добрый день, если вопрос ещё актуален, даю решение своей задачи.
          1. Нужно было настроить кучку зеркал, спасибо за решение Юрию, с ответа выше. Правда не забудьте проверить что у вас заменены кавычки, и поставленный скобки
          2. Чтобы скрипт правильно обрабатывал адрес галавного домена нужно прописать в wp-config.php

          define('WP_HOME', 'eximatrading.ru');
          define('WP_SITEURL', 'eximatrading.ru');
          

          Но есть проблема, на странице главного домена, невозможно попасть в админе панель, я решил это простой проверкой, обернув

          if ($_SERVER['SERVER_NAME'] !== 'main-domain.ru') {
           
          define('WP_HOME', 'eximatrading.ru');
          define('WP_SITEURL', 'eximatrading.ru');
           
          }
          

          3. Включаем плагин, и радуемся редиректам)

        • 27
          @

          Самый просто вариант для зеркал

          define('WP_HOME', "http://{$_SERVER['HTTP_HOST']}");
          define('WP_SITEURL', "http://{$_SERVER['HTTP_HOST']}");
          

          В базе меняем старые ссылки на относительный

          • 28
            Александр
            @

            О!) Действительно, простое и интересное решение. Спасибо!

          • 29
            Ирина
            @

            Константин, а подскажите пожалуйста как должен выглядеть весь код плагина, со скобками и кавычками для кучи доменов
            СПАСИБО

            • 30
              @

              Добрый день. Это не плагин, а переменные wordpress который задаются wp-config.php напишите их перед строкой

              /* Это всё, дальше не редактируем. Успехов! */

              ( эта фраза может быть на англ языке )
              Потом в базе нужно убрать упоминания текущего домена ( и вообще любого ). Качаем бекап базы и через поиск убиваем адрес сайта.

              • 31
                Ирина
                @

                Константин, Спасибо за быстрый ответ. Но не выходит.

                Через phpmyadmin убираю — 2 ссылки home и blog url,
                в config прописываю
                define(‘WP_HOME’, «https://{$_SERVER[‘HTTP_HOST’]}»);
                define(‘WP_SITEURL’, «https://{$_SERVER[‘HTTP_HOST’]}»);

                и сразу:
                Error establishing a database connection

                через поиск в phpmyadmin еще находится куча абсолютных путей типа этого:;
                a:4:{s:10:»thevoux-wp»;O:8:»WP_Theme»:12:{s:6:»update»;b:0;s:20:»�WP_Theme�theme_root»;s:69:»/var/www/DOMAIN/data/www/DOMAIN/wp-content/themes»;s:17:
                что с ними то делать???

                И если понадобится поменять Название сайта , Краткое описание в /wp-admin/options-general.php то уже только через базу потом?

                • 32
                  @

                  1. /wp-admin/options-general.php — зачем что-то тут менять? Это не правильно!
                  Все изминения нужно делать тут wp-config.php в корне сайта.
                  2. Это не относительный путь, это путь к файлам, вам нужно менять только домен в ссылках http://DOMAIN, а не www/DOMAIN/
                  3. Вам нужно менять не только home и blog url а все ссылка в базе, сделайте поиск и замену, где искать нужно http://DOMAIN а заменять на постоту

                  • 33
                    Ирина
                    @

                    В wp-config.php добавлено:
                    /* That’s all, stop editing! Happy blogging. */

                    define(‘WP_HOME’, «https://{$_SERVER[‘HTTP_HOST’]}»);
                    define(‘WP_SITEURL’, «https://{$_SERVER[‘HTTP_HOST’]}»);

                    Потом в бекапе базы https://DOMAIN заменено на пустоту.

                    https://DOMAIN/wp-admin/ говорит:
                    One or more database tables are unavailable. The database may need to be repaired.

                    https://DOMAIN/ говорит:
                    Error establishing a database connection

                    Помогите, ЧЯДНТ?

                    • 34
                      @

                      База вообще работает без этих строк?
                      Перейдите на мой сайт ( кликните по Имени Константин ) и нажмите в Команде на Константин по email и напишите мне на почту.

                    • 35
                      Ирина
                      @

                      если взять отсюда метод https://gist.github.com/davejamesmiller/1965636

                      // Or add appropriate logic so it works on all servers:
                      if ($_SERVER['HTTP_HOST'] == 'dev.domain.com') {
                       define('WP_SITEURL', 'http://dev.domain.com');
                       define('WP_HOME', 'http://dev.domain.com');
                      } else {
                       define('WP_SITEURL', 'https://www.domain.com');
                       define('WP_HOME', 'https://www.domain.com');
                      }

                      его можно как-то переделать на более чем 2 домена? или это совсем нет то?

  19. 36
    @

    @Ирина. Легко!

    if ($_SERVER['HTTP_HOST'] == 'dev.domain.com') {
     define('WP_SITEURL', 'http://dev.domain.com');
     define('WP_HOME', 'http://dev.domain.com');
    } elseif ($_SERVER['HTTP_HOST'] == 'dev.domain2.com') {
     define('WP_SITEURL', 'http://dev.domain2.com');
     define('WP_HOME', 'http://dev.domain2.com');
    } else {
     define('WP_SITEURL', 'https://www.domain.com');
     define('WP_HOME', 'https://www.domain.com');
    }
    
Ваш комментарий