同步两个WordPress站点内容

时间:2013-11-14 作者:Omar Tariq

我在谷歌上搜索了很多,在WordPress SE和stackoverflow上都找到了答案。com。然而,答案有些不完整或根本不起作用。在这里,我将详细解释我的问题,给出我在这个问题上的进展以及我在解决这个问题时面临的障碍。

Assumptions:-

<这两个网站上的插件和主题都是预装的,而且完全相同
    假设表示文件夹的当前状态。它并不假定它们在以下进程启动时正在同步

    Problem:-

    <有一个站点a和站点B。如果站点a或站点B的任何帖子、页面、产品、图像、滑块图像、菜单、菜单项、类别、SEO设置等发生更改,则其他站点也应进行更改
  1. 如果发布的帖子或产品的类别包含前缀ABC-(例如ABC Windows Tips),则该帖子或产品应仅出现在网站B上。
    1. Current Progress:-

      我没有想出一个合理的解决方案,但我通过编辑wp配置将站点B连接到站点a的数据库。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\');
      

      Obstacles:-

      <我的站点B的管理员密码已更改为站点A的密码。(我不确定这是顺利还是一团糟。如果你能在这方面帮助我,那就太好了。)

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

一旦您拥有相同的数据库,您将拥有相同的用户,因此,用户“admin”(请不要使用“admin”作为用户名)的密码将是数据库中设置的密码,当然,这两个站点共享数据库后的密码也是相同的。

但是,您可以创建只能在一个站点中登录的用户和可以在另一个站点中登录的用户。

为此,在用户配置文件中添加一个名为“User Site”的字段,该字段将保存在用户元“User\\u 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 WordPress将返回站点A的url。对于正文中包含媒体url的帖子,一旦全部上传到站点A,则已包含站点A的url。

一个更灵活的解决方案允许您从两个站点上载文件,可以用于上载外部文件库,例如Amazon S3,并通过Amazon Cloudfront提供URL。This plugin 这样做会让你的生活变得轻松。其他插件,如this 为相同的pourpose提供使用其他服务的功能,但通过谷歌搜索很容易找到与您最喜欢的服务一起使用的插件。

SO网友:Joey Yax

我在wp配置中做了一些修改。允许WordPress使用我的版本控制过程的php。我认为,经过一些调整,这些修改也可以满足您的需要。

1) Make URLs relative instead of absolute.

这很有用,因为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) Define database credentials for both (or more) environments

在您的情况下,两台服务器的数据库凭据将是相同的。

您的用户名和密码在两个网站上都是相同的。

替换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) Sync the uploads between servers.

有几种方法可以做到这一点,而如何做到这一点实际上可能取决于您的服务器设置。rsync? 将上传内容存储在Amazon S3存储桶中?BitTorent Sync 可能有用(而且免费)。快速的谷歌搜索显示了本教程:http://blog.bittorrent.com/2013/09/17/sync-hacks-how-to-set-up-bittorrent-sync-on-ubuntu-server-13-04/

核心、插件和模板更新等内容也需要同步。通常,我会将所有这些都保存在版本控制中,并部署到两个服务器来处理这一问题。您可以通过将整个站点设置为同步而不仅仅是上载目录来实现这一点,但我没有这方面的经验,也不知道这会导致任何问题。

结束

相关推荐

Should I use multisite?

简而言之,我开始为我的客户提供廉价的网站服务。我开发了5个易于使用的WordPress主题。每个主题附带以下内容:主页-静态图像或图像旋转木马和简介副本</关于-静态图像和关于复制博客联系人-谷歌地图和联系人表单小部件(例如推特提要)My question我希望注册过程完全自动化。我还希望能够快速更新WordPress的新版本并添加新主题。为此,您会推荐WordPress Multisite吗?如果我让数百个站点运行一个数据库,我会遇到问题吗?我有终极云托管TSO HOST, 因此,空间和需求不应成