WP笔记

多个wordpress网站共享用户数据的方法

Wordpress可以自定义用户数据表,这样多个wordpress网站就可以共享用户数据了,有时候这是非常方便的,这些Wordpress站点应该安装在同一个数据库下,数据表前缀各不相同。由于Wordpress的用户数据表(wp_users和wp_usermeta)相对独立(点击这里查看Wordpress数据表关系),我们不用担心共享用户数据后会打乱其它的应用。

共享用户数据

更改用户表的方法是编辑站点的wp_config.php,加入如下代码,假设需要更改的站点前缀是wpen_,需要共享的用户表前缀是wp_

define('CUSTOM_USER_TABLE', 'wp_users');
define('CUSTOM_USER_META_TABLE', 'wp_usermeta');

例如我要做多语言站点,每个语言都是一个独立的wordpress安装,中文版本作为主站,在主站下安装一个新的wp站点作为英文版本,只共享用户数据,其它的都是独立的,类似multisite但有multisite不具备的优势,毕竟很多插件对multisite的支持不是很好。

这样更改存在一定问题,wp_usermeta表中存储了用户权限,这个权限的值是以wp前缀开头的,以管理员为例,管理员用户id为1,角色是administrator,则表中就有这样一条记录

user_id->1, meta_key->wp_capabilities, meta_value->a:1:{s:13:"administrator";s:1:"1";}

如果该用户去登陆共享数据并且以wpen_为前缀的网站(http://youdomain.com/wp-admin),就会被提示
You do not have sufficient permissions to access this page. (你没有足够的权限访问该页面)

解决的方法是向数据库插入包含wpen_前缀的数据,即

user_id->1, meta_key->wpen_capabilities, meta_value->a:1:{s:13:"administrator";s:1:"1";}

SQL语句为

INSERT INTO `dbname`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'wpen_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');

这样做仅仅使用户id为1的管理员可以正常登陆这两个网站,如果创建了新的用户,无论是管理员还是普通用户,都会被提示权限不足,除非你一条一条的向数据库里插入数据,并且要注意改变角色。一劳永逸的做法是写一段小代码让这个过程自动完成,代码如下

//设置主站的前缀,其它网站都共享该网站的用户数据表
$main_prefix = 'wp_';

//设置子站的前缀,例如有两个子站,前缀分别为wpen_和wpcn_
$addi_prefixs = array('wpen_','wpcn_');

//添加功能到用户注册的钩子里
add_action( 'user_register', 'dup_capabilities' );

function dup_capabilities( $user_id ) {

	global $main_prefix, $addi_prefixs;

        //获取该用户权限的值,因为不同角色的值是不同的
	if( $cap_val = get_user_meta( $user_id, $main_prefix.'capabilities', true ) ) {	

		if( count( $addi_prefixs ) > 0 ) {

			foreach( $addi_prefixs as $prefix ) {

				add_user_meta( $user_id, $prefix.'capabilities', $cap_val, true );

			}
		}
	}
}

WordPress 3.5上用这段代码

add_action( 'user_register', 'dup_capabilities' );
add_action('profile_update', 'dup_capabilities');
function dup_capabilities( $user_id ){
	//在这里设置数据表前缀,不分主站子站,全部写上即可。
	$prefixs = array('wp11_','wp12_','wp13_');
	global $table_prefix;
	$cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
	if( !empty( $cap_val ) ) {
		foreach( $prefixs as $prefix ){
			if( $prefix != $table_prefix )
				update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
		}
	}
}

这段代码放到主题的functions.php中或者做成一个小插件都可以。

如果注册的用户权限很低,例如是订阅者之类的角色,就没必要这样做了,管理员可以到每个网站单独创建一个,各自管理各自的,也是一种解决方法。

让用户在多个WordPress网站之间通行登录

继续读之前请了解以下事实:

这是一个wpmu的替代方案,并不是整合不同域名之间的wp网站,所有有一些限制。

1. 出于安全问题,cookie不能在多域名之间共享,如果你追求的是www.youdomain.com和www.anotherdomain.com之间通行登陆,以下的方法不适用。也许你应该尝试自动登录

2. cookie也不会在多浏览器之间共享,以下的方法只能实现在同一个浏览器中通行登陆。

3. 支持的类型:

次级域名之间的通行登陆,例如sub1.yourdomain.com和sub2.yourdomain.com之间通行登陆

同一个域名下不同目录之间互相登陆,例如www.yourdomain.com和www.yourdomain.com/site以及www.yourdomain.com/site1之间通行登陆。

go ahead…

既然主站和英文站共享了用户数据,那么用户从任何一个网站登录,都应该自动登入另一个网站,可以在两个网站之间任意切换。这就涉及到整合wordpress cookie的问题。

测试环境:

Wordpress版本: 3.3.1

主站:http://dev.solagirl.net (假设)

英文站:http://dev.solagirl.net/en (假设)

实现步骤:

1. 打开主站的wp-config.php,找到如下代码, 如果宏定义的值不是随机字符串,点击这里生成。

define('AUTH_KEY',         '{+Y:wtH~E}E2g7#$/_{%df9F2!9ed}m=E%^}%,[Z#;+R+vk]@q:x4u)?G,-#I89g');

define('SECURE_AUTH_KEY',  ' -$Hdq00N4F|iv4n&|}W]h:U}5?+jUb%)G#zgr={ 4yvgSRO;h-K+}R;&n.AAFv0');

define('LOGGED_IN_KEY',    '/K{%RclWh_e|46hl6w.b&C*U2cQ$&ZpL)n@|itUtHPm#PMS+9Jd|m%*5h#NQ1{k%');

define('NONCE_KEY',        '-Aluq5#|Pp:D6EsB8G-os=o${5FmP6!S#U)xgQsvAR2+0E/mz,{[b+6[zX4]OnUU');

define('AUTH_SALT',        'X:_SQx~;s}9|FIZ:pvR|beA>Jca_}.;S+sW>-^GFdFQ zjQUA<+G0z{_S+M');

define('LOGGED_IN_SALT',   'd`U.1inPDll}cH1Qcp,IaUeB+TO_m440$>IGs4B;v$)q^N>g[!&;t');

define('NONCE_SALT',       't`.LtDKyc9(fQlA@EMrvu*F(U6&CV:%qKQ:eKz+0I*.V,0(@9E~9K!2087pJqs=Q');

 

2. 拷贝主站wp-config.php中的AUTH_KEY和SECURE_AUTH_KEY到英文站的wp-config.php中,替换相应的行。如果嫌麻烦上面代码全部拷贝到英文站也可以。

3. 在主站和英文站的wp-config.php中创建下面代码,记得去生成一个复杂的随机字符串,不要直接拷贝,主站和英文站的SECRET_SALT值要相同

define('SECRET_SALT', 'Q$QuHIfQO^(CtrL5D(fcG$miB,fE2]-~::qoB,O_?o|TfgNfQB/x/kv$Tg1Aa7Hf');

4. 在主站和英文站的wp-config.php中创建如下代码

define('ADMIN_COOKIE_PATH', '/');
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');
define('COOKIEHASH', md5('用自己的随机字符串替换'));

5. 清除浏览器的cookie,选择其中一个网站登录,然后直接访问另一个网站的wp-admin,看是不是已经自动登陆了。

不同次级域名之间的通行登陆

在所有网站的wp-config.php中再加上

define('COOKIE_DOMAIN', 'yourdomain.com');

不要加www

70条评论

  1. 看到大家讨论这么热烈,博主的方法如果可以写成插件就完美了,期待实现本功能的插件作品!

  2. meta_value->a:1:{s:13:”administrator”;s:1:”1″;} 里面a:1:{s:13:”administrator”;s:1:”1″;} 是什么意思呀? 这是什么语言呢? a, s分别代表什么呢? 谢谢

    1. a和s表示数据类型,即array和string,后面的数字是数据长度,再后面引号(或大括号)里的是实际的数据内容。

      1. 请问,这些是数据表里面的数值吗?meta_vlaue的值怎么写呢,这么长的数据描述 可以有办法从数据表中直接生成这些格式的描述粘贴到这个meta_vlaue后面吗? 谢谢!

  3. 我在本地测试wp3.9版测试,A、B站,在同一数据库,A站前缀:wp_;B站前缀:ysz2_ 。

    我将以下代码加到B站的wp_config.php中:

    define('CUSTOM_USER_TABLE', 'wp_users');
    define('CUSTOM_USER_META_TABLE', 'wp_usermeta');

    修改“wpen_capabilities”为“ysz2_capabilities”在数据库中执行SQL语句 :

    INSERT INTO `dbname`.`wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'ysz2_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}')

    在本地B站用A站账号登陆,提示“您没有足够的权限访问该页面。”,重新换成B站的账号登陆B站提示“错误:无效用户名。忘记密码?”

    这是为什么呢?

    add_action( 'user_register', 'dup_capabilities' );
    add_action('profile_update', 'dup_capabilities');
    function dup_capabilities( $user_id ){
    //在这里设置数据表前缀,不分主站子站,全部写上即可。
    $prefixs = array('wp11_','wp12_','wp13_');
    global $table_prefix;
    $cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
    if( !empty( $cap_val ) ) {
    foreach( $prefixs as $prefix ){
    if( $prefix != $table_prefix )
    update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
    }
    }
    }
    是A、B站的“面板函数”都需要加上吗?

    1. 复制权限的函数在用户资料发生变更时执行,哪个站管理用户就加哪。这样就不需要手动执行sql语句了。另外这文章时间很久了,我没在最近的wp版本测试过,思路一样,具体代码可能有变化。

      1. 今天查看很的多站,测试后都是这样的结果,对于代码我能看懂简单的,叫我写我还真写不出来,几年前有学过程序编程,都忘记忘了,麻烦博主帮哈我,该怎么调试代码?

        1. 如果只是实现登陆的话,看一下文档按照步骤来就是了,官方文档是一直更新的http://codex.wordpress.org/Editing_wp-config.php#Custom_User_and_Usermeta_Tables

        2. 经过半的时间的折腾,结果还是不好,虽然在A站登陆后,进入B站能自动登陆,但是没有进入B站的后台权限,而在B站登出A站的管理员账号后,使用B站的账号登陆B站,提示“错误:无效用户名。忘记密码?”,这是为什么呢?

          我想实现的功能是,不管在A还是B站注册的用户,都能在登录别外一个站,而且在别外一站获得注册站的相同权限,后期在后台更改权限能同步? 不知道能否实现這些功能?方便的哈加我qq:583711752

        3. 权限不对说明数据库少记录,去数据库核实。测试这个需要很多时间,我暂时帮补了忙,抱歉。

  4. 如果是同个站点,不同目录,不同端口号可以用这个方法实现通行登录吗?

    1. 文章里的示例是主域名相同,站点位于两个不同目录下,跟你说的情况一样吗

    1. WordPress不提供这种功能,因此要看你具体需求。
      通常调用其他站点的文章可以通过rss,但灵活度比较低。也可以通过mysql直接查询,这个比较定制化,需要具体情况具体分析。

      1. 嗯,两个wordpress在同一个mysql,麻烦博主贴一下代码吧,谢谢了!

        1. 根据“个wordpress在同一个mysql”什么都写不了,不是标准的东西,建议你找个程序员具体去看你的网站,我帮不了你,抱歉。

  5. 您好,请问如果多个站点都安装有WooComerce,销售不同的东西的话,使用这个办法共享网站用户数据可行吗? 会不会导致销售数据记录混乱呢?

  6. 貌似有一个插件可以直接做到:Multisite User Management,地址我就不贴了,google一下,在wordpress的官方插件站里。

      1. 呃。。没仔细看。。不好意思哈,顺便问下,这个办法对安装了bbpress或者buddypress的站点是否也能用呢?

  7. 你好,Sola
    我借用你的方法,把下面这段代码复制到function.php里,后台就进不去了,那是什么原因呢?
    add_action( ‘user_register’, ‘dup_capabilities’ ); add_action(‘profile_update’, ‘dup_capabilities’); function dup_capabilities( $user_id ){ //在这里设置数据表前缀,不分主站子站,全部写上即可。 $prefixs = array(‘wp11_’,’wp12_’,’wp13_’); global $table_prefix; $cap_val = get_user_meta( $user_id, $table_prefix.’capabilities’,true); if( !empty( $cap_val ) ) { foreach( $prefixs as $prefix ){ if( $prefix != $table_prefix ) update_user_meta( $user_id, $prefix.’capabilities’, $cap_val ); } } }

    1. 这个没办法猜测,最靠谱的方法是你看一下你网站的错误日志,应该会记录到底哪里出了错,然后根据错误信息调整

  8. Pingback: 两个WordPress数据库合并和多个站点共享用户数据表 | 小谢的小站
  9. 测试了你给我的这个在3.5下可以正常使用!
    有一个问题不知道你能不能修复! 在后台的 用户——所有用户;这个面板上面有一个“将角色变更为…”的批量用户权限操作,在这里更改用户权限便不能所有子站同步!

    第二个问题: 如果我在后期添加子站的话,子站安装成功后以前注册的用户在这个子站是没有权限的,这个我想到的解决办法是在主站安装的时候就在数据库注册多余的前缀供后期子站注册使用(当然这样不是很好应该),这些是我现在测试出来的问题!

    显然要很完美是不可能的,但是非常感谢博主的无私分享精神!

    我以前在哪个博客是看到过有一个网站上整理出了很多WP的钩子和过滤器!后来无意给弄没有了,不知道博主知不知道这样的网站帮我推荐一个!

  10. 你说的那个放到A站主题里面然后在A站注册用户权限在B站就有,但是我要是在B站注册要将权限更新到A站那个代码是不是要重新写规则呢,再如果我还有C站,我在C站注册要吧权限更新到AB两个站代码又要怎么写呢,我三个站都在本地,设置默认注册都是订阅者底权限,你那个代码可以共享数据表,如果我要共享表里面的某个条木或字段怎么可以实现呢!

    1. 既然已经完全共享了user和usermeta表,也就是所有字段都共享了为什么还要单独共享某个条目或字段?
      我的代码就是完成你说的功能的,请看一下注释
      //设置主站的前缀,其它网站都共享该网站的用户数据表
      $main_prefix = ‘wp_’;
      //设置子站的前缀,例如有两个子站,前缀分别为wpen_和wpcn_
      $addi_prefixs = array(‘wpen_’,’wpcn_’);

      不论有多少子站,都可以加到$addi_prefixs中,所以,如果你那里有问题,请把你使用的代码发过来,因为你的配置和我的配置不一定相同,所以不要照搬我的代码。

      1. 我的三个网站分别为 wp11 ,wp12,wp13:

        我的设置是:主站wp11 , 子站,wp12,wp13
        //设置主站的前缀,其它网站都共享该网站的用户数据表
        $main_prefix = ‘wp11_’;
        //设置子站的前缀,例如有两个子站,前缀分别为wpen_和wpcn_
        $addi_prefixs = array(‘wp12_’,’wp13_’);

        我的安装顺序是 先正常安装 wp11,然后按照你这个配置wp12,wp13后安装这两个子站点,不知道是不是这样!

        只有主站注册的用户权限可以显示到wp12,wp13

        在wp12,wp13里面注册的用户无法在wp11里面显示权限!

        我是想把设置里面某项也给子站共享 比如我要共享 wp_options表里面option_name下面的permalink_structure字段 不知道怎么可以实现!

        还请姐姐告诉一下哈!

        1. 你用的wp 3.5吗,看了一下新版和旧版不一样了,你试一下下面的代码

          add_action( 'user_register', 'dup_capabilities' );
          add_action('profile_update', 'dup_capabilities');
          function dup_capabilities( $user_id ){
          	//在这里设置数据表前缀,不分主站子站,全部写上即可。
          	$prefixs = array('wp11_','wp12_','wp13_');
          	global $table_prefix;
          	$cap_val = get_user_meta( $user_id, $table_prefix.'capabilities',true);
          	if( !empty( $cap_val ) ) {
          		foreach( $prefixs as $prefix ){
          			if( $prefix != $table_prefix ) 
          				update_user_meta( $user_id, $prefix.'capabilities', $cap_val );
          		}
          	}
          }
          

          如果没问题的话,不论在哪个站注册,或者管理员在哪个站更新用户权限,其它站都会同步。

          我是想把设置里面某项也给子站共享 比如我要共享 wp_options表里面option_name下面的permalink_structure字段 不知道怎么可以实现!

          我觉得没必要,wp_options表里很多字段是不能共享的,比如siteurl。固定链接设置一下应该不麻烦吧,难道你要共享用户数据的站点很多吗?

  11. 我新建的两个站点, B共享A的用户数据,我在两个站点的主题functions里面都添加了你上面的那段代码,但是有一个问题,在A站点注册的用户在两个站点都可以有用户权限,但是在B站点注册的用户无法在A站点里面有权限,还有就是权限自动更新这两个怎么可以解决求教!

    1. 我自己测试可以。请你按照下面的方法查找问题
      在B站点注册一个用户,你应该能知道用户id,然后到wp_usermeta表中根据user_id找到刚刚创建的这个用户的权限(_capabilities),看一下是不是两个前缀的权限都创建了。

      另外自动更新权限,即一个站点更改用户权限后另一个随着更新,需要额外的代码,上面的代码只在创建的时候有效,不能同步。

    1. 本文介绍的通行登陆需要两个站点在一个域名,至少也得是子域名,如果在两个不同主域名下,则此法行不通。不知道你的两个站点具体啥情况。

        1. 这个应该可以实现通行登陆,至于为什么不行,看不到网站代码我也说不出有什么问题,如果搞不定建议雇个程序员解决吧。

  12. 我已经实现了数据库共享,有没有什么办法可以让不同站点的用户拥有不同权限,在A中我希望用户是投稿者,而在B中用户是作者。按照上面的方法,用户在A中注册然后在B登录获得的是和A一样的权限

    1. 你可以试试根据数据库前缀(区分不同站点)设置不同的权限值
      权限用数据库前缀+角色名称定义

      假设你有两个网站A和B,B共享A的user数据表,则A的权限会自动创建(假设A站数据表前缀为wp_),B的权限需要用代码添加。
      假设A站点注册用户默认为投稿者,则只需要添加B站点用户的权限(作者)
      经过调整的代码就是这样

      	add_action( 'user_register', 'dup_capabilities' );
      	function dup_capabilities( $user_id ) {
      		//获取该用户权限的值,因为不同角色的值是不同的
      		if( $cap_val = get_user_meta( $user_id, 'wp_capabilities', true ) ) {
      			$new_cap = array('author'=>1); //用户权限为作者
      			add_user_meta( $user_id, $prefix.'capabilities', $new_cap, true );
      		}
      	}
      

      若权限为投稿者,则改为

      $new_cap = array('contributor'=>1); 

      依此类推。

      我觉得是这样,但我没试过,你可以试试看,有问题继续交流

  13. 使用多站点功能,可是新用户注册后并没有权限和角色,有没有办法让新注册用户在各个子站都拥有权限和较色

  14. 我有这么个问题,
    首先,建立B博客,和使用wordpress的多站点功能建立子站点意义相同吗?
    因为我不喜欢www.digi-wo.com/b博客,这样的链接形式,我想要,b博客.digi-wo.com,这样的网址。
    其次,您说的权限问题,我有点不明白,我现在的问题是这样的:
    1,我的主站是一个多用户共同管理的博客站,假设有十个管理员
    2,我想建立的子站,是一个可以让订阅者也发表文章【此功能主题内置】的站点。
    3,也就是说,我子站注册的用户,无需获得高权限,我只是想让他使用主站已经注册的帐号直接登录子站,而不想让主站已经注册的用户再次注册子站。【或者是主站没有注册,在注册子站的时候,主站数据库[或公用数据库]也同时生成该用户】方便在两个网站之间登陆、发布内容。
    4,管理子站,由于发布文章只需要订阅者的权限,而且是前台发布的形式,所以我不需要所有的主站管理员都获得子站的管理权限,只需要他们可以正常登陆,这样的话,是不是我就不需要建立什么钩子了?只需要在wp_config.php内添加那两行代码,让两个博客站共同使用那两个用户数据的表单?
    说的比较麻烦,如果您有时间,希望可以跟我联系,谢谢。

    1. 首先,建立B博客,和使用wordpress的多站点功能建立子站点意义相同吗?

      不完全相同。独立博客自由度大,可定制化强,缺点是不具备用户共享和多站点登录的功能。wp的network更像是新浪博客,虽然每个博客都能换不同的主题和小工具,但可以具备的功能是主站限定的,自由度低,但更加统一。

      多站点可以改成次级域名的形式,就像wordpress.com那样,对服务器的要求在文档中有描述
      http://codex.wordpress.org/Before_You_Create_A_Network#Domain-based

      文中提到的权限问题,是指将多个独立博客安装在同一个数据库,且用户表共享,就会出现在一个网站注册却无法登陆其他网站的情况,因为wordpress的权限与数据表的前缀有关,安装在同一个数据库必然前缀不同。解决这个问题 需要用我提到的钩子,或者用@consam提到的修改核心文件的方法

      wp-includes/capabilities.php
      Find the line:
      $this->cap_key = $wpdb->prefix . ‘capabilities’;
      Change it too:
      $this->cap_key = ‘wp_capabilities’;

      对于您的需求,我理解为
      管理员需要具备主站administrator权限和子站能登陆后台的权限(例如editor)
      订阅者只需要能登陆就可以,不用访问后台

      实现的方法:
      如果是新站,即共享数据表以后才有用户注册,只需要
      1.更改wp-config.php,共享用户表
      2.手动为管理员添加权限,直接修改wp_usermeta表,添加wp_capabilities权限字段,将wp_替换为子站的前缀,需要什么样的权限,就相应修改值即可。这样,主站和子站管理员具有不同权限

      如果目前没有实现共享用户数据,主站中已经有很多订阅者用户,那么使用@consam提到的方法,直接修改核心文件更简单
      好处是,wp_usermeta表不会存在多余的数据,网站不多升级的时候也不会太麻烦。
      所需的改动也很少。
      1. 修改wp-config.php
      2. 修改wp-includes/capabilities.php

      关于多站点,我用的也不是很多,您说的问题我很感兴趣,不知道我的回复是有有用,很希望能和您继续讨论。

      1. 今天下午我已经进行了调试,没有使用多站点的功能,感觉那样会对以后的操作造成一些不方便的地方。
        我在网站空间根目录新建了文件夹,上传并安装了wordpress程序,新建了B博客,与之前的主博客,以下称之为A博客,共用一个数据库“wordpress”
        然后,我修改了B博客的wp_config文件,达到了共用A博客的user和usermeta的目的,实现了A博客用户直接登录B博客的目的。此时,B博客无注册功能,A博客管理员及其他权限用户均无法登录B博客后台。
        之后,我在数据库的,A博客_usermeta表单中,添加了B博客_capabilities的权限字段,使A博客ID为1的管理员成功登录B博客的后台。
        OK,至此,基本上我需要的功能已经实现,接下来,我还有几个问题。
        1,如果不登陆B博客后台,A博客用户信息是否可以直接同步到B博客,比如个人资料及其他信息。
        2,上文提到,可以使用钩子达到一劳永逸的目的,即在B博客的function文件中添加那段代码,但是我添加到结尾后,没有效果(我在A博客注册了新用户,也无法在B博客登录后台)【希望可以得到指导】
        3,由于这种新建博客的方式得到B博客的的链接形式为 http://www.xxx.com/B博客,我很想知道,应该如何把B博客的网址绑定为,B博客.xxxx.com。感觉这样更像子站点。
        希望可以得到指导。

        1. 1,如果不登陆B博客后台,A博客用户信息是否可以直接同步到B博客,比如个人资料及其他信息

          用户数据只存在于wp_users和wp_usermeta中,无论在哪个博客更新用户资料,都是修改这两个表,表共享,用户资料就是同步的。

          2.上文提到,可以使用钩子达到一劳永逸的目的,即在B博客的function文件中添加那段代码

          这段代码应该添加在你允许注册的那个博客中,既然A博客允许注册,那需要将这段代码添加到A博客中才能生效。

          3.关于链接的形式,创建一个子域名,指向B博客所在的目录,更新B博客的数据库,将所有地址替换为子域名的形式。如果B博客是新装的,到后台设置中更新一下网站地址就行了。如果已经有post,就要手动替换数据库中的链接。

        2. 1没问题了,
          2也搞定了,原来是添加到A博客。T_T
          小问题是,A博客之前注册的所有用户,都必须手动添加咯~
          好麻烦的说。

          下面再问问第三个相关的:
          关于链接的形式,创建一个子域名,指向B博客所在的目录
          OK,我在我域名控制面板已经解析了B博客.xxxx.com这个子域名,新的B博客,也没有文章,是新建立的。
          但是,所谓的指向,是指?我在域名管理那里没有找到如何指向。。。

        3. 如果你的数据库里已经有很多用户了,那用我的方法确实很麻烦,当然为已存在用户创建权限可以写个小程序完成。如果你直接修改B博客的
          wp-includes/capabilities.php

          $this->cap_key = $wpdb->prefix . ‘capabilities’;
          改成
          $this->cap_key = ‘wp_capabilities’;
          这些麻烦就都省了,只需要改一个文件,就算升级也不麻烦。

          关于域名的问题,创建子域名的时候应该会询问域名指向哪个目录吧?
          不知道您用的什么主机,通常创建子域名时,要求选择根目录下的某个目录,这时你只要选B博客所在的目录就可以了。难道没有这个选项?

  15. Pingback: wordpress用户整合:两个wordpress博客使用同一个用户表_乌徒帮_网站建设入门教程网_wordpress入门_入门者的起义!
  16. 哇,太牛了!
    也太巧了吧
    前天还是昨天,我也突发奇想,想弄两个wp共用同样的用户数据。
    搜索下,有个博客是说改config.php ,定义了那两个数据库表。
    测试时发现,权限问题。。

    1. 哈哈,充分证明只有想不到的没有做不到的。其实wordpress官网edit wp-config.php那段说的挺明白,权限问题也解释了。

  17. wp-includes/wp-capabilities.php
    Find the line:
    $this->cap_key = $wpdb->prefix . ‘capabilities’;
    Change it too:
    $this->cap_key = ‘wp_capabilities’;

    解决权限问题。

    1. 修改核心文件不太好吧,而且这句话的意思就是让wp_capabilities这句meta信息不在考虑前缀,为什么不直接修改数据库中的数据呢,我已经建了在线站测试了,只要把前缀的问题和cookie的问题处理好了,登陆、登出都是多站统一的。如果去改核心文件,以后更新就麻烦了

      1. 新注册才会注入。如果是修改用户权限。那不是所有的记录都更新吧?cookie 我已经完全按你的做了。可是不能统一登陆。囧 。

        1. 如果你需要频繁的更改用户权限,那你只需要写一个钩子函数,让wp在修改权限的时候也像注册那样更新权限不就可以了吗

    2. 其实你说的权限问题,wordpress文档里已经给出解答了
      http://codex.wordpress.org/Editing_wp-config.php#Custom_User_and_Usermeta_Tables

      Please note that permissions in the user_meta tables are stored with the table prefix of the site. So in the CUSTOM_USER_META_TABLE one must have entries for each site using that table. At the very least for the administrator, to avoid the “you do not have permissions error” you should have:

      prefix1_capabilities = a:1:{s:13:”administrator”;b:1;} and prefix2_capabilities = a:1:{s:13:”administrator”;b:1;} etc

      1. 代码不怎么懂。假设以后其中一个用户的角色变换。那其他前缀的数据库,也要手动更新了,对不对。所以,你的代码能不能更新完善,打包成小插件,可以直接用,呵呵,我门外汉。

        1. 理论上说可以实现自动更新的,不过我当时做的时候没有更换权限的需求,所以没考虑这部分。你说说你具体的需求是啥?我好考虑一下

        2. :mrgreen: 来如此,如果你希望自动更新权限,你可以试一下profile_update这个钩子,这个钩子的位置在
          wp-includes/user.php line 1374
          if ( $update )
          do_action(‘profile_update’, $user_id, $old_user_data);
          else
          do_action(‘user_register’, $user_id);
          写法应该和user_register那个函数差不多,只不过增加meta值要换成更新meta值,也就是
          add_user_meta()
          要换成update user meta()
          参考文档codex.wordpress.org/Function_Reference/update_user_meta

          你都能去改wp-capabilities.php,看懂这个应该不成问题吧 :mrgreen:
          我用空也装个在线站试试,原来的试完了就删了。如果你以后不打算升级wp,可以去改核心代码,不过不知道改完了会不会有别的副作用,没试验过

        3. 改核心那个是6年前人家开始使用的,我在官方网掘墓掘出来的。应该没啥问题吧。谢谢。 同步登陆这个,还是不行 ,也许是我服务器环境不同。

        4. 如果六年前用到现在都没出问题,那就没问题吧,看着也是那个意思。

        5. 同步登陆是session的问题,跟那个核心文件没关系,试试清除浏览器的cookie

评论已关闭。