如何在域和子域之间共享Cookie和会话?

时间:2014-01-22 作者:Hugh Key

我在寻找我问题的答案时错过了很多时间。今天,我在一台服务器和一个数据库上安装了两个WP,但前缀不同。我已经在两个博客之间共享了用户数据和元数据,效果很好!但我仍然无法在两个博客下设置autologin或单点登录。以下代码在WP3中不起作用。8.

define(\'COOKIE_DOMAIN\', \'.domain.com\'); //replace with the 1st website URL
define(\'COOKIEPATH\', \'/\'); 

1 个回复
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 阵列。编辑第二个站点的插件,使用第一个站点的实表前缀作为替换。

从现在起,两个站点上的用户将完全同步,登录一个站点将使该用户同时登录两个站点。

结束

相关推荐

Multiple textdomains

我有很多插件。显然,它们都有自己独特的国际化TextDomain(i18n)。我的所有插件中都包含了一堆文件,我把它们都放在一个名为common的目录中。这添加了一个我希望所有插件都拥有的仪表板小部件,以及一个用于更新的脚本(因为它们不在wordpress.org插件repo上)。我希望能够将我的公用文件夹放到我的每个插件中,而不必编辑文件。但我担心其中包含的文本字符串。我可以在同一个插件中为两个不同的域调用load\\u plugin\\u textdomain两次吗?考虑到i18n,处理这种情况的最佳