神级福利|多个wordpress网站共享用户数据的方法

前言:

当你的事业做大了,几个站点一起运营,那么难免要考虑到用户数据的共享问题。
WordPress可以自定义用户数据表,这样多个wordpress网站就可以共享用户数据了,有时候这是非常方便的,这些Wordpress站点应该安装在同一个数据库下,数据表前缀各不相同。由于Wordpress的用户数据表(wp_users和wp_usermeta)相对独立(点击这里查看Wordpress数据表关系),我们不用担心共享用户数据后会打乱其它的应用。

这儿是代码:

共享用户数据

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

  1. define(‘CUSTOM_USER_TABLE’, ‘wp_users’);
  2. 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语句为

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

  1. //设置主站的前缀,其它网站都共享该网站的用户数据表
  2. $main_prefix = ‘wp_’;
  3. //设置子站的前缀,例如有两个子站,前缀分别为wpen_和wpcn_
  4. $addi_prefixs = array(‘wpen_’,’wpcn_’);
  5. //添加功能到用户注册的钩子里
  6. add_action( ‘user_register’, ‘dup_capabilities’ );
  7. function dup_capabilities( $user_id ) {
  8.     global $main_prefix$addi_prefixs;
  9.         //获取该用户权限的值,因为不同角色的值是不同的
  10.     if$cap_val = get_user_meta( $user_id$main_prefix.’capabilities’, true ) ) {
  11.         ifcount$addi_prefixs ) > 0 ) {
  12.             foreach$addi_prefixs as $prefix ) {
  13.                 add_user_meta( $user_id$prefix.’capabilities’, $cap_val, true );
  14.             }
  15.         }
  16.     }
  17. }

WordPress 3.5上用这段代码

  1. add_action( ‘user_register’, ‘dup_capabilities’ );
  2. add_action(‘profile_update’, ‘dup_capabilities’);
  3. function dup_capabilities( $user_id ){
  4.     //在这里设置数据表前缀,不分主站子站,全部写上即可。
  5.     $prefixs = array(‘wp11_’,’wp12_’,’wp13_’);
  6.     global $table_prefix;
  7.     $cap_val = get_user_meta( $user_id$table_prefix.’capabilities’,true);
  8.     if( !emptyempty$cap_val ) ) {
  9.         foreach$prefixs as $prefix ){
  10.             if$prefix != $table_prefix )
  11.                 update_user_meta( $user_id$prefix.’capabilities’, $cap_val );
  12.         }
  13.     }
  14. }

这段代码放到主题的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,找到如下代码, 如果宏定义的值不是随机字符串,点击这里生成。

  1. define(‘AUTH_KEY’,         ‘{+Y:wtH~E}E2g7#$/_{%df9F2!9ed}m=E%^}%,[Z#;+R+vk]@q:x4u)?G,-#I89g’);
  2. define(‘SECURE_AUTH_KEY’,  ‘ –$Hdq00N4F|iv4n&|}W]h:U}5?+jUb%)G#zgr={ 4yvgSRO;h-K+}R;&n.AAFv0′);
  3. define(‘LOGGED_IN_KEY’,    ‘/K{%RclWh_e|46hl6w.b&C*U2cQ$&ZpL)n@|itUtHPm#PMS+9Jd|m%*5h#NQ1{k%’);
  4. define(‘NONCE_KEY’,        ‘-Aluq5#|Pp:D6EsB8G-os=o${5FmP6!S#U)xgQsvAR2+0E/mz,{[b+6[zX4]OnUU’);
  5. define(‘AUTH_SALT’,        ‘X:_SQx~;s}9|FIZ:pvR|beA>Jca_}.;S+sW>-^GFdFQ zjQUA<+G0z{_S+M’);
  6. define(‘LOGGED_IN_SALT’,   ‘d`U.1inPDll}cH1Qcp,IaUeB+TO_m440$>IGs4B;v$)q^N>g[!&;t’);
  7. 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值要相同

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

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

  1. define(‘ADMIN_COOKIE_PATH’, ‘/’);
  2. define(‘COOKIEPATH’, ‘/’);
  3. define(‘SITECOOKIEPATH’, ‘/’);
  4. define(‘COOKIEHASH’, md5(‘用自己的随机字符串替换’));

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

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

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

define(‘COOKIE_DOMAIN’, ‘yourdomain.com’);

不要加www

写在后面:

一点点看下来,也不会太难,慢慢领悟~

本文参考于  http://www.solagirl.net/multi-wordpress-sites-sharing-user-data.html ,若有任何来源问题,请联系QQ:1516677079 及时更正。

最有意思的设计站点


最好的UI素材库

我们极力推荐: