我在2个不同的子域中有2个WordPress站点,如 test1.abc.com 和 test2.abc.com 。这两个站点都激活了wp-require插件,只有登录用户才能看到该站点。我们想建立一个系统,如果用户登录到一个站点,他应该自动登录到另一个站点。
我尝试的是什么:
经过一番搜索,我知道我需要为两个站点使用一个数据库。所以我已经完成了这些步骤:
我已下载test2.abc.com网站的整个数据库,并将所有前缀wp_更改为wpmo_,将其替换为整个数据库并将其上传到第一个网站的数据库。 我在第二个站点的wp-config.php中添加了这两行,以定义第二个站点应该使用第一个站点的用户表而不是它自己的用户表。
define('CUSTOM_USERMETA_TABLE', 'wp_usermeta');
define('CUSTOM_USER_TABLE', 'wp_users');
现在,第二个网站正在使用第一个网站的用户,我可以通过第一个网站的用户详细信息登录到第二个网站。
下一个问题是cookie,所以我在两个站点的wp-config中添加了这些行。
define('COOKIE_DOMAIN', '.abc.com');
define('COOKIEPATH', '/');
define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8');
现在我登录test1.abc.com,当我去test2.abc.com时,它要求我登录。这意味着cookie不会从第一个站点传递到第二个站点。但是,我试图打印$ _COOKIE并且它给了我相同的加密值,但用户仍然没有在第二个站点上自动登录。当我回到第一个网站时,它会自动注销。我觉得这两个网站在某种程度上都与cookie有关,我很接近,但仍未达到我自动登录第二个网站的目标。
任何帮助?
解决方案:
在Mikk3lRo和其他人的帮助下,我设法解决了这个问题。我正在为面临同样问题的任何人发布解决方案。 在这里你可以找到分步指南:
步骤1:为两个安装使用一个数据库,在安装时使用2个不同的前缀安装2个wp。
第2步:确保wp-config.php文件中随机生成的密钥和salt也相同。
第3步:在第二个网站的wp-config.php中粘贴这两行。
//Share user tables
define('CUSTOM_USER_META_TABLE', 'SITE1_PREFIX_usermeta');
define('CUSTOM_USER_TABLE', 'SITE1_PREFIX_users');
第4步:与这些行共享Cookie。 (用wp-config.php写)
//Share cookies
define('COOKIE_DOMAIN', '.abc.com');
define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8');
第5步:现在,您可以在登录第一个网站时自动登录第二个网站。但是你会在第二个网站上发出错误消息"你没有权限访问这个页面",这是一件好事。
第6步:原因是,WordPress会检查用户功能(wp-includes / capabilities.php),因此您可以直接在数据库中添加此功能(如果您的用户很少)或者为此编写插件。 @ Mikk3lRo在评论中为此写了一个插件,这很好。
由于
答案 0 :(得分:4)
好吧 - 你非常接近,但还有一些事情要做。
所有要求如下:
wp1_
,wp2_
等等。wp1_users
和wp1_usermeta
表格 - 您已经完成了这项工作 - 如果只有您正确地拼写了常量名称,那么您实际上已经克服了这个障碍......它' s CUSTOM_USER_META_TABLE
(比你的要强一个)COOKIE_DOMAIN
和COOKIEHASH
在子域名之间共享Cookie - 您已完成此操作prefix_capabilities
表格中每个网站的每个用户都有usermeta
个条目 - 我不认为您已经完成了此操作,只是因为您尚未达到你认识到必要的程度。这是wp-config.php
:
//Share user tables
define('CUSTOM_USER_META_TABLE', 'wp1_usermeta');
define('CUSTOM_USER_TABLE', 'wp1_users');
//Share cookies
define('COOKIE_DOMAIN', '.abc.com');
define('COOKIEHASH', 'aee53c017c29dc0d3ae37253fc8cbfd8');
/**
* In my case these are not needed - but they may well be if one
* of the installs is located in a sub-folder. I have not tested
* this theory though.
*/
//define('COOKIEPATH', '/');
//define('SITECOOKIEPATH', '/');
//define('ADMIN_COOKIE_PATH', '/wp-admin');
//These all need to be identical
define('AUTH_KEY', 'this should be random');
define('SECURE_AUTH_KEY', 'this should also be a random string');
define('LOGGED_IN_KEY', 'one more random string');
define('AUTH_SALT', 'oh my - so many random strings');
define('SECURE_AUTH_SALT', 'salt, salt, salt and no eggs');
define('LOGGED_IN_SALT', 'this is sooooo random');
/**
* These do not need to be shared - in fact they probably shouldn't be
* - if they are you could (in theory) do actions on one site that was
* intended for the other - probably not a very big concern in reality
*/
define('NONCE_KEY', 'these should be random too, but can differ');
define('NONCE_SALT', 'one site has one, the other another');
这足以让您登录这两个网站 - 但仍有最后烦人的子弹留在列表中。
问题在于,您的权限("功能")仅在其中一个网站上有效,因为meta_key
的前缀是网站的表格前缀。如果你稍微谷歌,你会发现许多解决方案建议修改wp-includes/capabilities.php
只是使用一个共同的前缀 - 我强烈建议不要这样做! (不是出于安全原因,而是因为你需要在每次更新后制作这个补丁/黑客......而且修改核心文件只是一种非常糟糕的做法)
为了弥补这个障碍,你需要复制wp1_capabilities
表中的wp1_usermeta
行(对于每个用户!),给它一个新的umeta_id
并替换表前缀{{ 1}} wp1_
列中包含wp2_
。您需要为每个网站执行此操作,因此您有一行meta_key
meta_key
,一行wp1_capabilities
,依此类推。
如果您和您的朋友是唯一登录网站的用户,那么只需手动通过phpMyAdmin或其他东西 - 如果您需要它动态工作,那么它应该是相当的可以使用小插件自动化(参见下面的编辑)。
我一直讨厌这种设计 - 表格前缀在表格行中没有业务!我认为多站点安装需要它,但我确信还有其他(更好)的方法来解决它...
这个简单的插件将复制并在创建或编辑用户时更新wp2_capabilities
表中的所需行。
值得注意的是,它可能无法使用多站点安装,因为它们具有一些特殊功能/角色。我没有测试过这个。
可能需要针对特定用例进行细化(请发表评论),但是对于仅包含少数用户的有限测试用例,它可以正常工作。对于拥有数千个用户的站点来说效率低下,但因为它只在用户被修改时运行,并且只在需要时才进行更新,我怀疑这将是一个主要问题。然而,应该相对容易地适应仅读取和修改刚刚添加/编辑的用户。尽管如此,它会使初始设置复杂化,因为预先存在的用户在第一次运行时不会自动复制。
创建文件夹usermeta
并将内容放在wp-content/plugins/duplicate-caps
中 - 并且不要忘记在wordpress admin中的duplicate-caps.php
下激活。它需要安装在所有站点上。
plugins
答案 1 :(得分:1)
我相信最简单的解决方案是使用WordPress中的一个'单点登录(SSO)插件。
列出了大量插件here。
您可以使用其中一个或将身份验证基于其中一个。
另外,multi-site可让您创建网站网络,如果您决定创建多网站,请先阅读this。
答案 2 :(得分:-1)
我认为定义cookie不足以登录wp网站。
所以我的解决方案是,创建一个插件来限制那些没有登录到其中一个站点的人的访问权限。 用户登录其中一个站点时设置cookie。 当用户查看网站时。检查cookie值,然后重定向或返回该站点。
示例代码:
add_action('wp_login','prefix_set_cookie'); //when someone logged in this call the set_cookie function
function prefix_set_cookie(){
setcookie('hashed_cookie','my_value'); //set the cookie
}
//call check_cookie function when wordpress site loads
add_action('wp','check_cookie');
function check_cookie(){
//check the cookie value and view the website
if(isset($_COOKIE['hashed_cookie'] )){
if($_COOKIE['hashed_cookie'] == 'my_value'){
return;
}else{
die("no access please login <a href='your login link'>LINK</a>");
}
}
}
此插件的主要缺点是安全性差。任何人手动创建此cookie。所以它的高安全性,不要使用它。尝试尽可能地散列cookie,以免手动创建。
(如果你想要将插件放在某处的完整代码)
更新(完整插件):
<?php
/*
Plugin Name: Restrict Access
Author: Pasindu Jayawardane
Description: This Plugin Restrict Access to the Site without login
Author URI: https://www.facebook.com/pj.pasiya
*/
$key = hash('md5','restrict_access');
$value = hash('md5','true');
add_action('wp_login','es_set_cookie');
function es_set_cookie(){
global $key, $value;
setcookie($key, $value ,time()+3600);
}
add_action('wp_logout','es_remove_cookie');
function es_remove_cookie(){
global $key, $value;
setcookie($key, $value ,time()-3600);
}
add_action('wp','es_check_cookie');
function es_check_cookie(){
global $key, $value;
if(isset($_COOKIE[$key] )){
if($_COOKIE[$key] == $value){
return;
}else{
?>
<h1 class="alert alert-danger">
This Website is Protected! <small>You Must Login to See the Website</small>
</h1>
<p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p>
<?php
die();
}
}else{
?>
<h1 class="alert alert-danger">
This Website is Protected! <small>You Must Login to See the Website</small>
</h1>
<p class="ra-login"> <a href="<?php echo wp_login_url(); ?>"> Login </a> <p>
<?php
die();
}
}
转到你的wordpress安装插件目录({{wp install folder}} - &gt; wp-content-&gt;插件并制作扩展名为.php {{file-restrict.php}}的新文件。复制并粘贴此代码
为两个网站执行此操作
转到wordpress插件并激活插件。 (两个网站)
登录其中一个网站后,您可以查看任一网站。一旦您注销一个站点,它就会显示一条消息,其中包含登录该站点的链接。
(激活后只需注销并登录网站)
我也会给你发电子邮件。