乌徒帮技术范儿WordPressWordPress使用 › wordpress用户整合:两个wordpress博客使用同一个用户表

wordpress用户整合:两个wordpress博客使用同一个用户表

分类:WordPress使用

在某些特殊情况下,我们用不同的wordpress博客实现不同的运营功能,但同时我们又希望注册的用户能在它们之间共用,因此,我们希望我们的wordpress能够聪明到使用同一个用户表_users来存储用户信息,让用户通行这些博客之间。本文就将为你实现这一功能。

要点:1、两个博客使用一个数据库;2、两个博客通过wp-config.php的配置,使用同一个_users和_usermeta表;3、增加权限记录。

具体实施过程:

1、先正常安装一个wordpress博客,假设命名为博客A,安装在http://www.utubon.com/blogA/。

2、安装第二个博客blogB,这个时候需要进行一些配置,安装时一定要和博客A使用同一个数据库,但数据库表前缀不同,数据库用户名和密码可以不同。

3、第二个博客安装成功,这个时候,通过对第二个博客的wp-config.php进行配置,让第二个博客使用第一个博客的_users和_usermeta表。在wp-config.php中间位置,$table_prefix = ‘’的下面添加下面的代码:

define('CUSTOM_USER_TABLE', 'blogA_users');
define('CUSTOM_USER_META_TABLE', 'blogA_usermeta');

这样,第二个博客就会使用第一个博客的用户表,他们之间就可以共用了。但是要注意的是,这样会让所有的用户在权限上,在不同博客中都相同,例如一个博客的编辑,也会是另一个博客的编辑。如果你对这些用户的权限控制较为严格的话,可能需要再仔细考虑。

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

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

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

解决的方法是向数据表blogA_usermeta插入包含blogB_前缀的数据,即

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

SQL语句为

INSERT INTO `blogA_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'blogB_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');

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

//添加功能到用户注册的钩子里
add_action( 'user_register', 'dup_capabilities' );
function dup_capabilities( $user_id ) {
  global $wpdb;
  $main_prefix = $wpdb->prefix;
  $addi_prefixs = array('blogA_','blogB_');// 把你需要同步的所有博客的表前缀放到这个数组中
  //获取该用户权限的值,因为不同角色的值是不同的
  if( $cap_val = get_user_meta( $user_id, $main_prefix.'capabilities', true ) ) {	
    if( count( $addi_prefixs ) > 0 ) {
      foreach( $addi_prefixs as $prefix ) {
        update_user_meta($user_id, $prefix.'capabilities', $cap_val) OR add_user_meta( $user_id, $prefix.'capabilities', $cap_val, true );
      }
    }
  }
}

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

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

另外还有一个关于在不同域名之间同步登录,涉及到cookies的问题,你需要阅读这篇文章

本文适合对wordpress数据库比较了解的开发者阅读。

已有6条评论 快速评论
  1. 否子戈 #4341楼 回复给@4340楼 2014/07/07 10:18:37 回复

    我对代码进行了简单的修改,把代码放在所有博客的functions.php中

  2. Kim #4340楼 2014/07/03 02:16:20 回复

    楼主,请问那个代码是放到哪个站点的function.php中呢?。我的主站放在网站根目录,前缀为wp_1,另外一个站放在sri文件夹,前缀为wp_sri,那么我该如何设置

  3. 否子戈 #1154楼 回复给@1152楼 2012/06/01 16:53:18 回复

    1、多站点和本文所指是完全不同的,建议看一下http://www.utubon.com/88/ 一文了解多站点的一些方法
    2、域名的开通和博客本身没有关系,关键在于两个博客使用同一个数据库,不同的数据表前缀,然后利用wp-config.php进行数据表的配置

  4. 否子戈 #1153楼 回复给@1151楼 2012/06/01 16:26:51 回复

    “如果我在第一个博客中注册用户为管理员,那么登录第二个博客就不会出问题了”的理解是不对的,在文章中有所说明,即当你使用了新的数据表之后,需要在新使用的_usermeta表中增加一条规定权限的记录,否则仍然会出现上述的问题。

  5. 博雅 #1152楼 2012/06/01 10:08:51 回复

    还有,这个是两个博客,如果我想做多站点,应该怎么弄?
    我不喜欢【www.xxxx.com/bbb】我喜欢【bbb.xxxxx.com】

  6. 博雅 #1151楼 2012/06/01 10:07:21 回复

    你好,你说的那个会出现的问题的意思是:
    在第二个博客中注册的用户,如果登录一个博客的后台时会提示错误
    如果我在第一个博客中注册用户为管理员,那么登录第二个博客就不会出问题了,是这样吧?
    还有几个问题请教,希望可以联系我,谢谢。

填写个人信息,赶快回复吧!