填写您的邮件地址,订阅我们的精彩内容:

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

892

在某些特殊情况下,我们用不同的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数据库比较了解的开发者阅读。

下面我简单说几句