技术介绍
是否希望在两个或更多WordPress网站之间共享用户信息和登录会话?如果是这样,可以按照本指南逐步学习如何操作。
最近,我就遇到了这种需求。我需要在一个网站上同步主网站的用户信息,并实现类似单点登录的功能(我们将这个网站称为站点B),虽然主网站(站点A)和站点B是两个独立的WordPress网站。幸运的是,这两个网站都托管在同一台服务器上,这使得实现这个操作变得容易。
在我解决这个难题之后,决定写一篇文章来协助在做这个需求时处理遇到的一些麻烦。此外,该过程可以扩展到任意数量有需求的网站。就我而言,只需要在两个WordPress网站之间同步登录详细信息和cookie。
要求场景
- 站点A和站点B必须位于同一顶级域(子文件夹或子域)。
- 站点A和站点B将使用相同的数据库。
还需要FTP访问这两个网站,我们将需要编辑两个网站的wp-config.php文件。当然,如果使用的是宝塔,那就更方便了。如果符合要求,我们可以继续前进。
获取完整的网站备份(可选)
由于我们将编辑wp-config.php和数据库,因此最好是安全并完整的备份网站,或者至少是数据库和wp-config.php文件。为此,我建议使用All-in-One WP Migration、Updraft Plus、WP Time Capsule,选择一个顺手的插件进行备份。
共享用户和用户元信息
为了在两个网站上拥有相同的用户登录名和密码,我们将使用相同的数据库表。如果使用的是默认前缀,则这些名称为wp_users和wp_usermeta。
1、检查站点A的表前缀
如果不确定站点的表前缀,请打开站点A的wp-config.php并查找以下行:
$table_prefix = ‘wp_’;
默认情况下,它是wp_,但如果不同,请记住它,因为我们需要将它用于站点B的wp-config.php。保持wp-config.php打开,稍后我们将需要更多信息,以及编辑它。
2、为站点B安装WordPress(如果已经存在,请忽略这一步)
请记住,我们将使用与站点A相同的数据库,因此必须为站点B使用不同的表前缀(如果站点B已经存在,并且已经有了一些用户信息,那需要做取舍,或者这是关乎用户信息导出合并的问题,这里没有相关解决方案)。在我的示例中,我使用 com_,简称社区。可以使用想到的任何字母,都没关系。
如果使用的工具用于自动WordPress安装,不允许选择数据库和前缀,不要担心,因为稍后可以从wp-config更改。只需确保在子文件夹或子域中安装了WordPress 。
打开站点B的wp-config.php,并将数据库名称,用户和密码替换为站点A的。
define('DB_NAME', 'siteAdatabase');
define('DB_USER', 'siteAuser');
define('DB_PASSWORD', 'siteApassword');
现在两个站点都使用了相同的数据库。确保站点B使用不同的表前缀,以下是我的实例:
$table_prefix = ‘com_’;
3、在网站之间共享WordPress用户
要做到这一点,我们需要做的是确保站点B使用和站点A相同的表的用户和用户元信息,即wp_users和wp_usermeta(再次确认你的主站数据库表前缀)。打开站点B的WP-config.php文件,在“ /* That’s all, stop editing! Happy blogging. */”上方添加以下行:
define( 'CUSTOM_USER_TABLE', 'wp_users' );
define( 'CUSTOM_USER_META_TABLE', 'wp_usermeta' );
/* That's all, stop editing! Happy blogging. */
请注意,wp_是站点A的表前缀。如果你的不同,则需要更新这些行。
干得好,截至现在这两个网站已经共享相同的用户(如果做的一切都正确)。
共享登录Cookie
既然两个网站都使用相同的登录信息,但会注意到,当切换网站时,则必须再次登录。这可以通过共享登录cookie来解决,我们继续:
1、编辑站点A的wp-config.php
就在 /* That’s all, stop editing! Happy blogging. */之上,添加以下行:
define( 'COOKIE_DOMAIN', '域名1' );
define( 'COOKIEHASH', md5( '域名2' ) );
/* That's all, stop editing! Happy blogging. */
在第一行中,必须将域名替换为实际域。在第二行,必须放置WordPress站点地址(URL),可以从仪表板 – >设置 – >常规查看到。
不要关闭站点A的wp-config.php,我们仍然需要处理站点B的一些信息。
2、编辑站点B的wp-config.php
与我们对数据库名称,用户和密码的处理方式类似,我们现在将从站点A复制以下行 并替换站点B中存在的行:
define('AUTH_KEY', 'stringof40characters');
define('SECURE_AUTH_KEY', 'stringof40characters');
define('LOGGED_IN_KEY', 'stringof40characters');
define('NONCE_KEY', 'stringof40characters');
define('AUTH_SALT', 'stringof40characters');
define('SECURE_AUTH_SALT', 'stringof40characters');
define('LOGGED_IN_SALT', 'stringof40characters');
define('NONCE_SALT', 'stringof40characters');
其中,“stringof40characters”是已存在的40个字符的随机字符串,这里是示意。
接下来,我们需要确保站点B与站点A共享登录cookie。
与上一步类似,我们现在编辑站点B的wp-config.php,在 /* That’s all, stop editing! Happy blogging. */之上,添加以下行,记得替换地址:
define( 'COOKIE_DOMAIN', '域名1' );
define( 'COOKIEHASH', md5( '域名2' ) );
/* That's all, stop editing! Happy blogging. */
获取站点B的管理员权限
完成上述步骤后,两个网站就实现了用户信息同步和登录了。但会发现站点B的后台进不去了,不能访问管理仪表盘,因为站点A的wp_usermeta数据表中,并没有记录用户对站点B的访问权限,为了使站点A的管理员用户能拥有站点B的管理权限,我们需要在a_usermeta数据表中插入如下权限记录:
INSERT INTO `test`.`a_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`) VALUES (NULL, '1', 'com_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
通过上面的mysql命令,插入用户对B站点的权限后,我们就可以正常访问B站的后台了。注意:记得清理cookies!
如果不会MySQL,也可以使用phpmyadmin使用鼠标点击wp_usermeta数据表中meta_key值为wp_capabilities记录项前面的复制链接,phpmyadmin会自动跳转到插入功能并填入相应值,只需要修改前缀(站点B的)再点击执行即可。
如果使用宝塔,则通过主站点A的数据库管理按钮进行登录。进入数据库后,找到站点A的数据表wp_usermeta进行复制修改,并执行。
umeta_id (留空,会自动递增)
user_id:1(站点A上管理员的user_id)
meta_key:com_capabilities(com_ 是我的示例站点B的前缀,将其替换为你的前缀)
meta_value:复制从wp_capabilities中为user_id = 1粘贴相同的meta_value
现在已经完成了两个网站的用户信息共享,并同时登录功能,也可以以站点A的管理员角色来管理站点B的后台。
👋 感谢您的观看!