多个wordpress网站共用一个数据库 实现用户信息共享

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进行查看。如下图所示:

wp-config.php中的数据库安装信息1
wp-config.php中的数据库安装信息2(第66行的内容,即数据库表前缀)

安装从站

如果从站还没有安装,则使用规划好的信息,并进行了第三步的配置后,进行安装。安装到设置管理员账号密码的时候,会无法输入管理员账号、也不需要输入管理员密码。此时登录的时候,必须使用主站的管理员账号密码进行登录。等网站全部设置完成后,在主站上拥有账号的所有人,即可正常从从站使用主站上注册的账号进行登录。

如果已经安装好了,则需要记下其中的数据库名称、数据库用户名、数据库用户密码、数据库表前缀。

尤其需要注意,从站不能与主站使用相同的数据库表前缀。

理论上,从站可以有很多个。实际上也的确如此(如果不考虑性能和网站数据臃肿的话,否则请根据服务器性能量力而行)。

wp-config.php中的数据库安装信息3
wp-config.php中的数据库安装信息4(第66行的内容,即数据库表前缀)

修改配置

WordPress 把用户核心数据存储在 wp_users 数据表中,包括用户名、密码、邮箱等信息;附加数据存储在 wp_usermeta 数据表中,如用户色角色和权限。 该数据表同时也用来存储一些附加设置用来提高用户体验,其中包括管理界面配色方案,是否显示管理工具条等设置。

为实现共用用户数据,我们必须让主站与所有从站使用相同的用户信息表,即需要使用作为主站的用户数据表。在本教程示例中,即为主站与所有从站共用表main_usermain_usermeta

修改配置的方法很简单,此时我们打开从站配置文件wp-config.php,添加如下两行代码(最好使用专业的文本编辑工具,例如notepad++等等)。

define('CUSTOM_USER_TABLE', 'main_users');
define('CUSTOM_USER_META_TABLE', 'main_usermeta');

如果有多个从站,则需要逐个进行设置。

到此,你的mainChild两站用户数据共享已经完成,都可以使用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群,联系我进行讨论。谢谢。

Scroll to Top