SO网友:Frank P. Walentynowicz
我将跳过与共享DB和共享用户数据和元数据相关的步骤,前提是您做得正确。
让我们集中讨论wp配置。两个站点的php。这些定义MUST BE IDENTICAL 对于两个站点:
define(\'COOKIE_DOMAIN\', \'.domain.com\'); // your main domain
define(\'COOKIEPATH\', \'/\');
define(\'COOKIEHASH\', md5(\'domain.com\')); // notice absence of a \'.\' in front
以及
仅生成一次,密钥和盐,复制到wp config。两个站点的php。
现在,如果您作为一个站点上的任何用户登录,那么您将作为第二个站点上的同一用户登录。
但是等等。当您在一个站点上创建新用户,在同一站点上以刚创建的用户身份登录,并尝试访问第二个站点的/wp admin/时,会发生什么情况?您可能会看到以下消息:
Sorry, you are not allowed to access this page.
这是因为,在第二个站点上,新创建的用户尚未分配任何角色。
在用户创建或更改用户配置文件时,如何避免用户在两个站点上都不同步?
我写了一个插件,应该放在两个站点的/wp-content/mu插件中。让我们创建一个新文件fpw-sync-users.php
, 包含以下代码:
<?php
// Users synchronization
function fpw_synchronize_admins_on_admin_login( $user_login, $user ) {
if ( array_key_exists( \'administrator\', $user->caps ) ) {
global $wpdb;
$site_prefix = $wpdb->prefix;
$admins_only = true;
$other_prefixes = array(
\'wp_\',
);
$args = array(
\'fields\' => \'ID\',
);
if ( $admins_only )
$args[ \'role\' ] = \'administrator\';
$users = get_users( $args );
foreach ( $users as $id ) {
$cap = get_user_meta( $id, $site_prefix . \'capabilities\', true );
foreach ( $other_prefixes as $prefix )
update_user_meta( $id, $prefix . \'capabilities\', $cap );
}
}
}
add_action( \'wp_login\', \'fpw_synchronize_admins_on_admin_login\', 10, 2 );
function fpw_synchronize_user_on_admin_register( $id ) {
$me = wp_get_current_user();
if ( array_key_exists( \'administrator\', $me->caps ) ) {
$other_prefixes = array(
\'wp_\',
);
$user = get_user_by( \'id\', $id );
$cap = $user->caps;
foreach ( $other_prefixes as $prefix )
update_user_meta( $id, $prefix . \'capabilities\', $cap );
}
}
add_action( \'user_register\', \'fpw_synchronize_user_on_admin_register\', 10, 1 );
function fpw_synchronize_user_on_profile_update( $user_id ) {
if ( current_user_can( \'edit_user\', $user_id ) ) {
$other_prefixes = array(
\'wp_\',
);
$cap = array( $_POST[ \'role\' ] => true, );
foreach ( $other_prefixes as $prefix )
update_user_meta( $user_id, $prefix . \'capabilities\', $cap );
}
}
add_action(\'edit_user_profile_update\', \'fpw_synchronize_user_on_profile_update\');
并将其复制到两个目的地。
现在,编辑第一个站点的插件,用第二个站点的real table前缀替换“wp\\u0”,在所有三个站点中$other_prefixes
阵列。编辑第二个站点的插件,使用第一个站点的实表前缀作为替换。
从现在起,两个站点上的用户将完全同步,登录一个站点将使该用户同时登录两个站点。