Мультисайт WordPress для локальной и удаленной разработки

Опубликовано: 2021-07-19

При разработке для Интернета часто используется локальная и удаленная среды. В случае одиночных сайтов WordPress это работает нормально. Однако установка многосайтового WordPress значительно усложняет ситуацию.

В поисках решения проблемы установки WordPress на нескольких сайтах мы наткнулись на серию статей, написанных Джоном Расселом в Laubster Boy. В этих статьях он обозначил способ решения этой проблемы для сред удаленной разработки и производства, который был довольно близок к тому, что мы хотели. С некоторыми изменениями нам удалось более или менее разобраться. Однако с тех пор некоторые обновления WordPress нарушили это решение, и нам пришлось вернуться к решению этой проблемы.

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

Намерение

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

Проблема

Многосайтовые настройки WordPress всегда перенаправляют на базовую установку, в данном случае на удаленную. Это затрудняет работу над базой кода разработки, которая будет точно отражать удаленный сайт.

Чтобы обойти это, необходимо запустить две установки, использующие разные базы данных. Это может привести к запутанным конфликтам и проблемам с синхронизацией, поскольку при каждом редактировании код и базы данных должны быть объединены.

Решение

Мы будем использовать плагин WPMU Domain Mapping.

Обратите внимание, что несколько файлов из этого плагина будут редактироваться напрямую, поэтому важно помнить об этом, если вы обновляете плагин по какой-либо причине!

Этот процесс предполагает, что у вас есть многосайтовая установка WordPress в удаленной и локальной средах.

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

Итак, с настройкой фона, давайте приступим к шагам!

Структура каталогов для локального и удаленного мультисайта WordPress

Для справки: файловая структура для этой настройки как в локальной, так и в удаленной среде будет следующей:

 + - wp-config.php
|
+ - .htaccess
|
+ - wp-content
| |
| + - sunrise.php
| |
| + - плагины
| |
| + - wordpress-mu-domain-mapping
| |
| + - Changelog.txt
| |
| + - domain_mapping.php
| |
| + - readme.txt
| |
| + - sunrise.php
| |
| + - wordpress-mu-domain-mapping.php

1. Удаленный

В этом разделе содержится подробная информация об удаленных файлах и настройках.

1.1 файл wp-config.php

Это не должно изменяться на удаленном сервере.

1.2 Сопоставление доменов WordPress MU (удаленно!)

Загрузите плагин WordPress MU Domain Mapping отсюда:

https://en-gb.wordpress.org/plugins/wordpress-mu-domain-mapping/

Установите на удаленном сайте и «активируйте по сети», чтобы он был активен на всех сайтах.

1.3 Sunrise.php

Скопируйте файл sunrise.php из плагина wordpress-mu-domain-mapping прямо в каталог wp-content , чтобы он находился здесь:

/wp-content/sunrise.php

1.4 Завершение удаленного редактирования

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

2. Местные

В этом разделе показано, что нужно делать на localhost. Часть кода дублируется, но весь показан для полноты.

2.1 файл wp-config.php

Скопируйте приведенный ниже код и вставьте в файл wp-config.php. Затем вы можете обновить его, добавив данные из вашего удаленного wp-config.php (база данных и т. Д.)

Вам нужно будет обновить это, указав сведения о вашей базе данных и т. Д., Но мы собираемся получить документ, подобный тому, который показан ниже в « Листинге кода 1: wp-config.php ».

Листинг 1: wp-config.php


<? php

define ('ОКРУЖАЮЩАЯ СРЕДА', 'развитие');
определить ('WP_DEBUG_LOG', истина);
определить ('WP_DEBUG_DISPLAY', истина);
определить ('WP_DEBUG', истина);

/ * Настройки MySQL * /

/ ** Имя базы данных для WordPress * /
определить ('DB_NAME', 'mysite_db');

/ ** имя пользователя базы данных MySQL * /
определить ('DB_USER', 'mysite_user');

/ ** пароль базы данных MySQL * /
определить ('DB_PASSWORD', '***********');

/ ** Имя хоста MySQL * /
определить ('DB_HOST', 'example.com');

/ ** Кодировка базы данных для использования при создании таблиц базы данных. * /
определить ('DB_CHARSET', 'utf8');

/ ** Тип сортировки базы данных. Не меняйте это, если сомневаетесь. * /
определить ('DB_COLLATE', ”);

определить ('AUTH_KEY', '***********');
define ('SECURE_AUTH_KEY', '***********');
define ('LOGGED_IN_KEY', '***********');
define ('NONCE_KEY', '***********');
определить ('AUTH_SALT', '***********');
define ('SECURE_AUTH_SALT', '***********');
define ('LOGGED_IN_SALT', '***********');
define ('NONCE_SALT', '***********');

$ table_prefix = 'wp_';

/ * Мультисайт * /
определить ('WP_ALLOW_MULTISITE', истина);
define ('МУЛЬТИСАЙТ', истина);
определить ('ПОДДОМЕН_УСТАНОВИТЬ', ложь);
define ('DOMAIN_CURRENT_SITE', 'example.com');
определить ('PATH_CURRENT_SITE', '/');
определить ('SITE_ID_CURRENT_SITE', 1);
определить ('BLOG_ID_CURRENT_SITE', 1);

определить ('ADMIN_COOKIE_PATH', '/');
определить ('COOKIEPATH', ”);
определить ('SITECOOKIEPATH', ”);

// Материал разделяемой БД WPMU
define ('ВОСХОД', 'ВКЛ');
определить ('WP_PRODUCTION_DOMAIN', 'example.com');
определить ('WP_DEVELOPMENT_DOMAIN', 'mysite-local-domain');

/ * Все, прекращать редактирование! Удачного ведения блога. * /

/ ** Абсолютный путь к каталогу WordPress. * /
if (! defined ('ABSPATH')) {
определить ('ABSPATH', dirname (__FILE__). '/');
}

/ ** Устанавливает переменные WordPress и включенные файлы. * /
require_once (ABSPATH. 'wp-settings.php');

2.2 Сопоставление доменов WordPress MU (локальное!)

Добавьте тот же плагин на локальный сайт. Вы можете подумать, что это так, согласно удаленному сайту, но вы ошибаетесь!

Откройте файл domain_mapping.php в своем любимом редакторе и отредактируйте строки 708 и 709, чтобы весь оператор if выглядел так:

Листинг 2: domain_mapping.php


if ($ url && $ url! = untrailingslashit ($ protocol. $ current_blog-> domain. $ current_blog-> path)) {
$ redirect = get_site_option ('dm_301_redirect')? «301»: «302»;
if ((defined ('VHOST') && constant ("VHOST")! = 'yes') || (defined ('SUBDOMAIN_INSTALL') && constant ('SUBDOMAIN_INSTALL') == false)) {
$ _SERVER ['REQUEST_URI'] = str_replace ($ current_blog-> путь, '/', $ _SERVER ['REQUEST_URI']);
}
// заголовок («Местоположение: {$ url} {$ _ SERVER ['REQUEST_URI']}», true, $ redirect);
// выход;
}

2.3 Sunrise.php

Сначала скопируйте файл sunrise.php из плагина wordpress-mu-domain-mapping в каталог wp-content. Возможно, здесь уже есть файл sunrise.php. Не волнуйтесь - просто перезапишите его.

Скопируйте отсюда:

/wp-content/plugins/wordpress-mu-domain-mapping/sunrise.php

Сюда:

/wp-content/sunrise.php

Затем отредактируйте этот новый файл sunrise.php, добавив строки вокруг строки 40, чтобы он выглядел как код ниже:

Листинг 3: sunrise.php


<? php if (! defined ('SUNRISE_LOADED')) {define ('SUNRISE_LOADED', 1); } if (defined ('COOKIE_DOMAIN')) {die ('Константа «COOKIE_DOMAIN» определена (вероятно, в wp-config.php). Удалите или закомментируйте эту строку define ().'); } $ wpdb-> dmtable = $ wpdb-> base_prefix. 'domain_mapping';
$ dm_domain = $ _SERVER ['HTTP_HOST'];

if (($ nowww = preg_replace ('| ^ www. |', ”, $ dm_domain))! = $ dm_domain) {
$ where = $ wpdb-> prepare ('домен IN (% s,% s)', $ dm_domain, $ nowww);
} еще {
$ where = $ wpdb-> prepare ('домен =% s', $ dm_domain);
}

$ wpdb-> suppress_errors ();
$ domain_mapping_id = $ wpdb-> get_var («ВЫБРАТЬ идентификатор блога ИЗ {$ wpdb-> dmtable} WHERE {$ where} ORDER BY CHAR_LENGTH (домен) DESC LIMIT 1»);
$ wpdb-> suppress_errors (ложь);
if ($ domain_mapping_id) {
$ current_blog = $ wpdb-> get_row («ВЫБРАТЬ * ИЗ {$ wpdb-> blogs} WHERE blog_id = '$ domain_mapping_id' LIMIT 1»);
$ current_blog-> домен = $ dm_domain;
$ current_blog-> путь = '/';
$ blog_id = $ domain_mapping_id;
$ site_id = $ current_blog-> site_id;

определить ('COOKIE_DOMAIN', $ dm_domain);

$ current_site = $ wpdb-> get_row («ВЫБРАТЬ * из {$ wpdb-> site} WHERE id = '{$ current_blog-> site_id}' LIMIT 0,1»);
$ current_site-> blog_id = $ wpdb-> get_var («ВЫБЕРИТЕ blog_id FROM {$ wpdb-> blogs} WHERE domain = '{$ current_site-> domain}' AND path = '{$ current_site-> path}'»);
if (function_exists ('get_site_option')) {
$ current_site-> site_name = get_site_option ('имя_сайта');
} elseif (function_exists ('get_current_site_name')) {
$ current_site = get_current_site_name ($ current_site);
}

определить ('DOMAIN_MAPPING', 1);
}

/ *
* 1) ДОБАВЛЕННЫЙ КОД МУЛИТИЗИТА
* /

// Фильтрует отображаемый / выводимый домен в HTML
add_filter ('pre_option_home', 'dev_pre_url_filter', 1);
add_filter ('pre_option_siteurl', 'dev_pre_url_filter', 1);
add_filter ('the_content', 'dev_content_filter', 100);
add_filter ('content_url', 'dev_content_url_filter', 100, 2);
add_filter ('post_thumbnail_html', 'dev_content_filter', 100);
add_filter ('wp_get_attachment_link', 'dev_content_filter', 100);
add_filter ('wp_get_attachment_url', 'dev_content_filter', 100);
add_filter ('upload_dir', 'dev_upload_dir_filter', 10);

function dev_pre_url_filter () {
глобальный $ wpdb, $ path, $ Switch;
$ url;
$ Switch_path;
$ blog_id = get_current_blog_id ();

if (! $ Switch) {
$ url = is_ssl ()? 'https: //': 'http: //';
$ url. = WP_DEVELOPMENT_DOMAIN;
if (! is_main_site ()) {
$ url. = rtrim ($ путь, '/');
}

вернуть $ url;
} еще {
$ Switch_path = $ wpdb-> get_var («ВЫБРАТЬ путь ИЗ {$ wpdb-> blogs} WHERE blog_id = {$ blog_id} ORDER BY CHAR_LENGTH (path) DESC LIMIT 1»);
$ url = is_ssl ()? 'https: //': 'http: //';
$ url. = WP_DEVELOPMENT_DOMAIN;
$ url. = rtrim ($ переключенный_путь, '/');

вернуть $ url;
}
}

function dev_content_filter ($ post_content) {
глобальный $ wpdb;

$ blog_details = get_blog_details ();
$ original_url = $ wpdb-> get_var («ВЫБРАТЬ домен ИЗ {$ wpdb-> dmtable} WHERE blog_id = {$ blog_details-> blog_id} ORDER BY CHAR_LENGTH (domain) DESC LIMIT 1»);
$ dev_url = WP_DEVELOPMENT_DOMAIN. $ blog_details-> путь;

if ($ original_url! == null) {
$ post_content = str_replace ($ original_url. '/', $ original_url, $ post_content);
$ post_content = str_replace ($ original_url, $ dev_url, $ post_content);
}
// Измените все URL, чтобы они указывали на постановку (изображения, якоря, все что угодно в содержимом публикации)
$ post_content = str_replace (WP_PRODUCTION_DOMAIN, WP_DEVELOPMENT_DOMAIN, $ post_content);
// Измените URL-адреса для «загрузки», чтобы они указывали на производство, чтобы изображения были видны
$ post_content = str_replace (WP_DEVELOPMENT_DOMAIN. $ blog_details-> path. 'wp-content / uploads', WP_PRODUCTION_DOMAIN. $ blog_details-> path. 'wp-content / uploads', $ post_content);

вернуть $ post_content;
}

/ *
* Фильтрует функцию content_url - специально ищет вызовы content_url ('upload'), где путь содержит загрузки в строке
*
* Добавлено, чтобы MU-плагины могли использовать content_url на DEV и PROD
* /
function dev_content_url_filter ($ url, $ path) {
if (! empty ($ path) && strpos ($ path, 'uploads')! == false) {
вернуть str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ url);
}

вернуть $ url;
}

function dev_upload_dir_filter ($ param) {
$ param ['url'] = str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ param ['url']);
$ param ['baseurl'] = str_replace (WP_DEVELOPMENT_DOMAIN, WP_PRODUCTION_DOMAIN, $ param ['baseurl']);

вернуть $ param;
}

/ *
* Замена для /wp-includes/ms-load.php get_site_by_path
* /
function dev_get_site_by_path ($ _site, $ _domain, $ _path, $ _segments, $ _paths) {
глобальный $ wpdb, $ path;

// Чтобы в базе данных было возможное совпадение, установите для $ _domain значение WP_PRODUCTION_DOMAIN
$ _domain = WP_PRODUCTION_DOMAIN;

// Ищем сайт, соответствующий домену и первому сегменту пути
$ site = $ wpdb-> get_row ($ wpdb-> prepare («ВЫБРАТЬ * ИЗ $ wpdb-> blogs WHERE domain =% s and path =% s», $ _domain, $ _paths [0]));
$ current_path = $ _paths [0];

if ($ site === null) {
// Специально для основного блога - если сайт не найден, загружаем основной блог
$ site = $ wpdb-> get_row ($ wpdb-> prepare («ВЫБРАТЬ * ИЗ $ wpdb-> blogs WHERE domain =% s and path =% s», $ _domain, '/'));
$ current_path = '/';
}

// Устанавливаем путь, соответствующий первому сегменту
$ path = $ current_path;

вернуть $ site;
}

add_filter ('pre_get_site_by_path', 'dev_get_site_by_path', 1, 5);

3. .htaccess (локальный)

Вставьте следующее в ваш файл .htaccess (обратите внимание, что локальный каталог был удален из последней строки index.php RewriteRule):

Листинг кода 4: .htaccess


# НАЧАТЬ WordPress
<IfModule mod_rewrite.c>;
RewriteEngine On
RewriteBase /
RewriteRule ^ index.php $ - [L]

# добавить косую черту к / wp-admin
RewriteRule ^ wp-admin $ wp-admin / [R = 301, L]

RewriteCond% {REQUEST_FILENAME} -f [ИЛИ]
RewriteCond% {REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^ (wp- (content | admin | includes). *) $ 1 [L]
RewriteRule ^ (. *. Php) $ 1 [L]
RewriteRule. /index.php [L]
</IfModule>;

# КОНЕЦ WordPress

4. Виртуальные хосты

Настройте виртуальные хосты, чтобы вы могли ввести значение, указанное в wp-config.php (выше) для WP_DEVELOPMENT_DOMAIN, в адресную строку браузера и перейти на сайт. Обычно вы набираете localhost, но это отменяет это.

В примере кода (выше) виртуальный хост был настроен так, чтобы вводить «price-buckland» в адресной строке и направлять его в каталог, содержащий WordPress.

Процесс добавления виртуальных хостов в среду MAMP выглядит следующим образом:

1) В терминале:

 $ sudo vi / etc / hosts

2) Добавьте следующую строку, заменив ее соответствующим адресом, который вы хотите ввести в свой браузер:

 127.0.0.1 mysite-локальный-домен

3) Затем мы хотим активировать виртуальные хосты для вашей локальной среды, поэтому откройте следующий файл для редактирования:

 $ sudo vi /Applications/MAMP/conf/apache/httpd.conf

Найдите эти строки:

 # Виртуальных хостов
# Включить /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

И раскомментируйте строку «Включить», например:

 # Виртуальных хостов
Включите /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

4) Теперь отредактируйте следующий файл:

 $ sudo vi /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

И добавьте две записи - во-первых, чтобы разрешить localhost в вашем браузере, а во-вторых, чтобы добавить новый виртуальный хост, что позволит вам ввести пользовательский домен в свой браузер и подключиться к локальному серверу:

 DocumentRoot "/ Пользователи / имя пользователя / htdocs /"
    ServerName localhost


    DocumentRoot "/ Users / имя пользователя / htdocs / mysite-local-directory"
    Имя сервера mysite-local-domain

5) Перезагрузите сервер apache. В моем случае MAMP, но из командной строки запускаем:

 перезапуск apachectl

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

Вы также должны иметь возможность отправить свои изменения на удаленный сервер и увидеть точную копию на удаленном сайте.

Устранение неполадок, предостережения и подводные камни!

К сожалению, многие (многие) вещи могут пойти не так. Вот некоторые симптомы и способы попробовать:

    1. Страницы администратора в порядке, но я не могу посещать внутренние интерфейсные страницы!
    2. .htaccess либо отсутствует, либо не инициализирован. Добавьте файл и повторно сохраните постоянные ссылки.
    3. Продолжение следует!

Если при работе на локальном сайте вы перейдете на:

 Мои сайты> Администратор сети> Панель управления

Вы попадете на удаленный сайт, то есть:

 example.com/wp-admin/network

Возможно, это не то, что вам нужно, но вы можете ввести текст прямо в адресную строку и оставаться в локальной среде, то есть:

mysite-локальный / WP-администратор / сеть

Заключение

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

Вы также должны иметь возможность отправить свои изменения на удаленный сервер и увидеть точную копию на удаленном сайте.

Сообщите нам, как вы справились с этим пошаговым руководством по мультисайту WordPress для локальной и удаленной разработки, в комментариях ниже!


Если вам нужна помощь в веб-разработке, не стесняйтесь обращаться к нам.