wordpress为网站系统提供了相同的数据表结构,为快速实现多个WordPress网站之间共享用户数据提供了可能。
现在有一个需求,即:我有若干wordpress开发的网站,这些网站是同一些用户在进行使用。但内容又完全不同。怎么能提高效率,减少重复注册和各自独立的用户管理?
本文将进行分析,并描述实现过程与要求。
分析
- wordpress为网站系统提供了相同的数据表结构,为快速实现多个WordPress网站之间共享用户数据提供了可能。
- 要实现用户信息共享的网站,在同一个服务器上(不同服务器也可以,只要数据库能相互访问,只是这样既不安全、也影响访问速度。)
- 我的几个网站,都是在同一个服务器。
- 几个要共用用户信息的网站,使用同一个数据库的不同前缀的数据库表。
- 这一点我的几个网站也符合要求。如果不符合要求,可以先进行数据库和所有文件的完整备份。在做完后,对数据库进行修改。
- 在完成用户信息对接后,要对用户信息的新增、更新进行同步。
- 此处我做了一个小插件,单独存在一个用于用户信息更新的功能。可以随时停用、或者进行维护。
准备
- 主站和从站,使用同一个sql。
- 主站main
- 域名:
main.test.com
(为方便理解,此处模拟假设一个网址,http://192.168.11.10/main
) - 数据库名称:
test
- 数据库用户:
root
- 数据库用户密码:
root123
- 数据表前缀:
main_
- 域名:
- 从站Child1
- 域名:
Child1.test.com
(为方便理解,此处模拟假设一个网址,http://192.168.11.10/Child1
) - 数据库名称:
test
- 数据库用户:
root
- 数据库用户密码:
root123
- 数据表前缀:
Child1_
- 域名:
操作
安装主站
如果主站还没有安装,则使用规划好的信息,进行安装。
如果已经安装好了,则需要记下其中的数据库名称、数据库用户名、数据库用户密码、数据库表前缀。
这些信息可以从网站根目录的wp-config.php
进行查看。如下图所示:


安装从站
如果从站还没有安装,则使用规划好的信息,并进行了第三步的配置后,进行安装。安装到设置管理员账号密码的时候,会无法输入管理员账号、也不需要输入管理员密码。此时登录的时候,必须使用主站的管理员账号密码进行登录。等网站全部设置完成后,在主站上拥有账号的所有人,即可正常从从站使用主站上注册的账号进行登录。
如果已经安装好了,则需要记下其中的数据库名称、数据库用户名、数据库用户密码、数据库表前缀。
尤其需要注意,从站不能与主站使用相同的数据库表前缀。
理论上,从站可以有很多个。实际上也的确如此(如果不考虑性能和网站数据臃肿的话,否则请根据服务器性能量力而行)。


修改配置
WordPress 把用户核心数据存储在 wp_users
数据表中,包括用户名、密码、邮箱等信息;附加数据存储在 wp_usermeta
数据表中,如用户色角色和权限。 该数据表同时也用来存储一些附加设置用来提高用户体验,其中包括管理界面配色方案,是否显示管理工具条等设置。
为实现共用用户数据,我们必须让主站与所有从站使用相同的用户信息表,即需要使用作为主站的用户数据表。在本教程示例中,即为主站与所有从站共用表main_user
与main_usermeta
。
修改配置的方法很简单,此时我们打开从站配置文件wp-config.php
,添加如下两行代码(最好使用专业的文本编辑工具,例如notepad++等等)。
define('CUSTOM_USER_TABLE', 'main_users'); define('CUSTOM_USER_META_TABLE', 'main_usermeta');
如果有多个从站,则需要逐个进行设置。
到此,你的main
、Child
两站用户数据共享已经完成,都可以使用main
站点的用户数据注册登录,但wordpress在_usermeta表中有对用户权限的记录,到这一步,你的Child
站虽然可以使用main
站的用户数据登录,但不能访问后台,访问会提示用户权限不够。
增加自动更新
为了让main
网站上的用户,都能拥有child
网站的合法身份(即角色,例如订阅者,作者,编辑,管理员),我们需要对main
网站上现有的用户信息进行更新。
注意:数据库操作前,请进行完整备份。
参照下图,在主站的插件目录下,创建一个update_user_role
文件夹,在该文件夹内部创建一个php文件,名称为update_user_role.php
。文件名必须和文件夹同名。

<?php /** * Plugin name: 用户权限自动更新 By:迷路轮回 * Plugin URI: http://www.xyx115.com/xyx115 * Description: 多个wordpress网站使用同一个网站用户信息进行访问。 * Version: 1.0 * Author: 迷路轮回 * Author URI: http://www.xyx115.com/Author * Author email: xyx115@qq.com * License: GPL-2.0 * Donate URI: http://www.xyx115.com * Text Domain: 迷路轮回 用户权限自动更新 * Domain Path: /lang * Requires at least: 5.3 * Requires PHP: 5.6 **/ add_action( 'user_register', 'dup_capabilities' );// 注册用户时触发 add_action( 'profile_update', 'dup_capabilities' );// 更新用户信息时触发 function dup_capabilities( $user_id ){ /* // 1次更新所有用户角色信息。根据实际情况任选其一 // 使用方法:取消注释,在主站上任选一个账号,进行账号信息更新,或者直接新增一个账号即可(达到触发该脚本的目的)。 // 所有权限完成更新后,即隐藏或者删除即可。 $user_list = get_users(); // 获取当前主站中的所有注册用户信息。 foreach( $user_list as $main_user ) { // 遍历当前网站所有用户 $main_cap_val = get_user_meta( $main_user->ID,'main_'.'capabilities',true); // 获取主站中,当前id的用户角色信息。返回值为数组。 update_user_meta( $main_user->ID, 'child_'.'capabilities', $main_cap_val ); // 更新用户元数据,此处更新的用户id不变,用户元数据的数据字段改为了从站,用户角色为主站中已经有的用户角色。 } */ /* // 1次更新所有用户角色信息。根据实际情况任选其一 // 如果主站中添加了自定义用户角色,使用上面的代码,无法正常更新这部分特殊用户角色的账号,可以使用下面的方法进行更新。 // 使用方法: // 1.更改其中的custom_role_kefu为你当前主站中存在的自定义用户角色权限,custom_role_userguest为另一个。也可以添加更多。 // 2.更改其中的author为希望将上面的自定义角色名称,更改为从站上的新角色的名称。 // 3.取消注释,在主站上任选一个账号,进行账号信息更新,或者直接新增一个账号即可(达到触发该脚本的目的)。 // 所有权限完成更新后,即隐藏或者删除即可。 $user_list = get_users(); // 获取当前主站中的所有注册用户信息。 foreach( $user_list as $main_user ) { // 遍历当前网站所有用户 $main_cap_val = get_user_meta( $main_user->ID,'wp_'.'capabilities',true);// 获取主站中,当前id的用户角色信息。返回值为数组。 // 下面的if,用来处理主站点当中的自定义用户角色。此处将原来的两个用户自定义角色,更改为默认的作者(author)权限 if ( array_key_exists('custom_role_kefu',$main_cap_val) // 如果在用户角色数组中找到custom_role_kefu(自定义的一个用户角色) or array_key_exists('custom_role_userguest',$main_cap_val) ) // 同上,如果在用户角色数组中找到custom_role_kefu(自定义的另一个用户角色) { $key = array('author');// 定义一个数组,以作为新用户角色数组的key $new_cap_val = array_combine($key, $main_cap_val);// 对两个数组进行合并,形成新的数组内容,其中key为上面新定义的数组,值为前面查询到的内容。 $main_cap_val=$new_cap_val; // 把变量名称再转回去,这样直接用下面的一句命令完成用户角色更新。 } update_user_meta( $main_user->ID, 'child_'.'capabilities', $main_cap_val ); // 使用主站中获取到的用户权限信息,更新当前从站中的用户权限。 } */ // 下面的代码为长久需要。 // 当新增用户,或者对用户信息进行更新时,下面的代码将对该用户在其他所有从站上的用户角色信息进行更新。 $prefixs = array('main_','child_'); //在这里定义一个数组,用来存放所有主站、从站的数据库表前缀。 global $table_prefix;// 全局变量,返回当前操作的数据表前缀。例如:建站的时候,使用的前缀为wp_,那么此处即返回wp_ $cap_val = get_user_meta( $user_id,'main_'.'capabilities',true);// 获取该用户在主站中的用户角色的值,因为不同角色的值是不同的 if( !empty( $cap_val ) ) { // 如果主站中的用户权限不为空,则遍历所有站点,对该用户信息进行更新同步。 foreach( $prefixs as $prefix ) {// 遍历所有站点 数据库表前缀 列表 if( $prefix != $table_prefix )// 如果当前遍历到的 数据库表前缀 不等于 当前操作的 数据库表前缀 //即无需对自己进行任何更新,而是将自身更新到其他站点 update_user_meta( $user_id, $prefix.'capabilities', $cap_val ); // 使用主站中获取到的用户权限信息,更新当前子站中的用户权限。 } } } ?>
自动更新,所有需要交代的都在代码的注释里。创建如上所述的插件后,启用该插件。并对网站进行操作。让插件运行时机触发。

如果对内容有疑问,请添加QQ群,联系我进行讨论。谢谢。