Синхронизация содержимого сайтов WordPress

Я много googled, и я нашел ответы на WordPress SE и на stackoverflow.com. Однако ответы несколько неполные или вообще не работают. Здесь я подробно объясню свою проблему, даю свой прогресс в решении проблемы и препятствия, с которыми я столкнулся при решении проблемы.

Предположения: –

  1. Плагины и темы на обоих сайтах предварительно установлены, и они точно такие же.
  2. Папка Uploads также такая же.

Предположения указывают текущий статус папок. Он не предполагает, что они синхронизируются по мере запуска следующего процесса.

Проблема: –

  1. Существует сайт A и сайт B.
  2. Если какие-либо сообщения, страницы, продукты, изображения, изображения слайдера, меню, пункты меню, категории, настройки SEO и т. Д. Сайта А или сайта В меняются, то его следует изменить и на другом сайте.
  3. Если публикация или публикация опубликована с категорией, содержащей префикс ABC- (например, ABC-Windows Tips), то этот пост или продукт должен появляться только на сайте B.

Текущий прогресс:-

Я не придумал разумного решения, но я подключил сайт B к базе данных сайта A, отредактировав wp-config.php.

Я также скопировал следующий код для обоих сайтов:

Сайт A: –

define('WP_HOME','http://siteA.com'); define('WP_SITEURL','http://siteA.com'); 

Сайт B: –

 define('WP_HOME','http://siteB.com'); define('WP_SITEURL','http://siteB.com'); 

Препятствия: –

  1. Мой пароль администратора для сайта B был изменен на пароль сайта A. (Я не уверен, что это будет ALRIGHT или MESSED UP. Если вы можете мне помочь в этом, это будет здорово.)
  2. Папка uploads не синхронизируется. Объекты мультимедиа, загруженные через сайт A, видны только на сайте A. Избранные изображения сообщений идут 404 на сайте B. Мы можем либо сделать папку uploads для синхронизации между двумя различными веб-хостингами. Или сделайте так, чтобы сайт B начинал собирать изображения из папки «A» для загрузки. Что-то вроде определения констант, как мы делали для дома и сайта, т.е. WP_HOME и WP_SITEURL.

После того, как у вас будет тот же db, у вас будут одни и те же пользователи, поэтому откройте пароль для пользователя «admin» (пожалуйста, не используйте «admin» в качестве имени пользователя) будет тот, который установлен в базе данных, и, конечно же, тот же для 2 сайты, когда они делят db.

Однако вы можете создавать пользователей, которые могут войти только на одном сайте, а также пользователи, которые могут войти в систему другим.

Для этого добавьте поле в профиль пользователя под названием «Пользовательский сайт» , который сохранит значение, введенное пользователем «user_site» пользователя.

 function site_profile_field( $user ) { if ( ! current_user_can('promote_users') ) return; // only for admins echo '<h3>' . __('User Site') . '</h3>'; echo '<table class="form-table">'; $now = get_user_meta( $user->ID, 'user_site', true ) ? : ""; echo '<tr><th><label for="user_site">' . __('Enter the domain') . '</label></th>'; printf( '<td><input type="text" name="user_site" id="user_site" value="%s" /></td></tr>', esc_attr($now) ); echo '</table>'; } add_action( 'show_user_profile', 'site_profile_field' ); add_action( 'edit_user_profile', 'site_profile_field' ); function site_profile_field_save( $user_id ) { if ( ! current_user_can( 'edit_user', $user_id ) ) return; $site = filter_input(INPUT_POST, 'user_site', FILTER_SANITIZE_URL); if ( $site ) { update_user_meta( $user_id, 'user_site', $site ); } } add_action( 'personal_options_update', 'site_profile_field_save' ); add_action( 'edit_user_profile_update', 'site_profile_field_fields_save' ); 

Затем каждый раз, когда пользователь регистрируется на сайте, вы можете проверить мета и сравнить с константой WP_SITEURL , если нет совпадения, вы можете заблокировать пользователя

 add_action( 'wp_authenticate', 'check_user_site', 1, 2 ); function check_user_site( $username, $password ) { if ( ! defined('WP_SITEURL') ) return; $user = get_user_by( 'login', $username ); if ( $user->exists ) { $allowed = get_user_meta($user->ID, 'user_site', true); if ( $allowed ) { $domain = parse_url(WP_SITEURL, PHP_URL_HOST); $allowed_domain = parse_url($allowed, PHP_URL_HOST); if ( ! substr_count( $domain, $allowed_domain ) ) { $password = NULL; // set password to null in this way login will fail } } } } 

Если поле «Пользовательский сайт» оставлено пустым или WP_SITEURL не определен, пользователь сможет войти на оба сайта.

Это для первой проблемы.

Для второй (выгрузка синхронизации) вы можете установить сайт B для использования папки загрузки сайтов A, но при этом каждая загрузка должна выполняться на сайте A, поэтому, если пользователи сайта B хотят загрузить файл, они не могут.

Это можно сделать, добавив параметр WP_CONTENT_URL в config.php , так что у вас будет (сразу после определения ABSPATH )

 define('WP_HOME', 'http://siteB.com'); define('WP_SITEURL', 'http://siteB.com'); define('WP_CONTENT_DIR', ABSPATH . 'wp-content'); define('WP_CONTENT_URL', 'http://www.siteA.com/wp-content'); 

Таким образом, вы должны загрузить все файлы на сайте A, а затем использовать эту конфигурацию на сайте B, когда используете правильную функцию для получения URL- wp_get_attachment_url приложения ( wp_get_attachment_url и т.п.) WordPress вернет URL-адрес сайта A. Для сообщений, содержащих носители url в теле, как только все они загружены на сайт a, уже содержат URL-адрес сайта A.

Более гибкое решение, позволяющее загружать файлы с обоих сайтов, может использоваться для загрузки внешней файловой базы, например Amazon S3, и обслуживания URL-адресов через Amazon Cloudfront. Этот плагин сделает вашу жизнь легкой в ​​этом. Другой плагин, подобный этому, обеспечивает функциональность использования других сервисов для такой же наживки, однако при поиске в Google будет легко найти плагин, который работает с вашим любимым сервисом.

У меня есть некоторые изменения, которые я делаю в wp-config.php, которые позволяют WordPress работать с моим процессом контроля версий. Я думаю, что с некоторыми изменениями модификации могут работать и для вашей цели.

1) Сделать URL-адреса относительными, а не абсолютными.

Это полезно, потому что WordPress любит писать абсолютные URL-адреса в базу данных, но поскольку вы обслуживаете один и тот же контент из разных URL-адресов, это становится беспорядочным.

Добавьте на wp-config.php следующее:

 define('WP_SITEURL', 'http://' . $_SERVER['SERVER_NAME'] ); define('WP_HOME', 'http://' . $_SERVER['SERVER_NAME']); define('WP_CONTENT_DIR', $_SERVER['DOCUMENT_ROOT'] . '/wp-content'); define('WP_CONTENT_URL', '/wp-content'); define('FS_CHMOD_DIR', (0755 & ~ umask())); define('FS_CHMOD_FILE', (0644 & ~ umask())); define('UPLOADS', WP_CONTENT_URL . '/uploads'); 

2) Определение учетных данных для обеих (или более) сред

В вашем случае учетные данные базы данных будут одинаковыми для обоих серверов.

Ваше имя пользователя и пароль будут одинаковыми на обоих сайтах.

Замените часть wp-config.php, где вы определяете учетные данные базы данных следующим образом:

 // define environments $environments = array( 'server1' => array( 'address' => array( 'domain1.com', 'www.domain1.com' ), 'db' => array( 'name' => '', 'user' => '', 'password' => '', 'host' => 'localhost', 'charset' => 'utf8', 'collate' => '' ), 'ssl' => false, 'dev' => false ), 'server2' => array( 'address' => array( 'domain1.com', 'www.domain2.com' ), 'db' => array( 'name' => '', 'user' => '', 'password' => '', 'host' => '', 'charset' => 'utf8', 'collate' => '' ), 'ssl' => false, 'dev' => false ) ); // allows wildcards in the array to be searched function better_in_array( $needle, $haystack ) { foreach ($haystack as $value) { if ( fnmatch( $value, $needle ) === true ) { return true; } } return false; } // loop through environments to get proper db credentials foreach( $environments as $key => $env ) { if ( better_in_array( $_SERVER['SERVER_NAME'] , $env['address'] ) ) { // if we find a matching environment, apply db credentials define( 'DB_NAME', $env['db']['name'] ); define( 'DB_USER', $env['db']['user'] ); define( 'DB_PASSWORD', $env['db']['password'] ); define( 'DB_HOST', $env['db']['host'] ); define( 'DB_CHARSET', $env['db']['charset'] ); define( 'DB_COLLATE', $env['db']['collate'] ); if ( $env['ssl'] == true ) { define( 'FORCE_SSL_ADMIN', true ); } if ( $env['dev'] == true ) { define( 'WP_DEBUG', true ); // Turn debugging ON define( 'WP_DEBUG_DISPLAY', false ); // Turn forced display OFF define( 'WP_DEBUG_LOG', true ); // Turn logging to wp-content/debug.log ON } $environment = $key; break; // break foreach if we find a match } } // make sure all db constants are set. if ( !defined( 'DB_NAME' ) || !defined( 'DB_USER' ) || !defined( 'DB_PASSWORD' ) || !defined( 'DB_HOST' ) || !defined( 'DB_CHARSET' ) || !defined( 'DB_COLLATE' ) ) { echo 'Environment not configured.'; exit; } 

3) Синхронизация загрузок между серверами.

Существует несколько способов сделать это, и как вы это сделаете, это может зависеть от настроек вашего сервера. rsync ? Сохранять загрузки в ведро Amazon S3? Синхронизация BitTorent может быть полезной (и бесплатной). Быстрый поиск по Google поднял этот урок: http://blog.bittorrent.com/2013/09/17/sync-hacks-how-to-set-up-bittorrent-sync-on-ubuntu-server-13-04 /

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