允许用户在WordPress多站点博客中手动添加或删除自己

时间:2020-10-26 作者:jsmod

我正在试用WordPress multisite,并已将其设置为网络上的主站点允许用户注册。

从我(初级)对WordPress multisite工作原理的理解来看:在主站点注册的用户可以查看所有网络内容,除非它受到保护。网络共享的数据库中只有一个用户表。但用户没有;“角色”;在子站点中,除非在管理区域或通过注册或同步用户的插件明确提供给他们。

然后我又建立了几个子网站,我让用户通过一个插件自动同步,因为我想在这些子网站上有一些仅限于特定用户角色的内容。这很好,这里没有问题。

但后来我尝试创建一个只能查看的私有子网站subscribers. 设置起来很容易。然而,我现在想做的是允许用户;“手动”;如果他们愿意,加入这个私人子网站,而不是我在管理区那样做。

为了澄清,我不想将所有用户同步到此子网站或其他私人网站。我想通过在主站点上放置一个网络子站点列表,使其完全可选,并带有;加入“;每个链接旁边的链接。因此,如果登录用户单击;加入“;他们成为该子网站的订阅者,可以查看其内容(如果他们单击“离开”,他们将不再被视为订阅者,只保留其他角色)。

我在互联网上找到的插件和许多示例代码通常automatically 将用户添加到子站点,或允许每个子站点注册。它们不包括允许用户自己手动加入/离开多站点博客。

只有一个长期被抛弃的插件正好解决了我要找的问题(称为Join My Multisite), 但是我认为PHP代码已经过时了,它的运行不是很顺利。它在WP存储库中不可用,但作者将其保存在Github上。

WordPress codex提到add_user_to_blog 函数,但我需要帮助理解如何在此上下文中使用它。我想要的很简单,但我不知道如何实现它。

我可以创建一个;加入“;允许我的主要站点用户加入他们想要加入的子站点的链接,或;“离开”;链接以仅从该子站点删除其用户角色?如果是的话,你能告诉我怎么做吗?

非常感谢。

1 个回复
最合适的回答,由SO网友:jsmod 整理而成

我做到了,它按我所希望的那样工作,但我真的不明白它是如何工作的(我想了解这一切背后的原因)。

祈祷和回答another question on WPSE 帮了我很多,我只是用我想实现的功能修改了它。

我将以下代码放入functions.php:

// Function to allow network users to manually subscribe to the sub-site

function subscribe_to_site()
{
// Check if the user is authenticated.
if (!is_user_logged_in()) {
return;
}

// Check if we have all necessary data.
if (
empty($_POST[\'subscribe_to_site_nonce\']) || empty($_POST[\'subscribe\']) ||
\'Subscribe\' !== $_POST[\'subscribe\']
) {
return;
}

// Verify the nonce.
if (!wp_verify_nonce($_POST[\'subscribe_to_site_nonce\'], \'subscribe-to-site\')) {
return;
}

// Add user to the current blog
add_user_to_blog(get_current_blog_id(), get_current_user_id(), \'subscriber\');

// Redirect back to the previous page.
wp_safe_redirect(wp_get_referer());
exit;
}
add_action(\'template_redirect\', \'subscribe_to_site\');

// Function to allow network users to unsubscribe from the sub-site

function unsubscribe_from_site()
{
// Check if the user is authenticated.
if (!is_user_logged_in()) {
return;
}

// Check if we have all necessary data.
if (
empty($_POST[\'unsubscribe_from_site_nonce\']) || empty($_POST[\'unsubscribe\']) ||
\'Unsubscribe\' !== $_POST[\'unsubscribe\']
) {
return;
}

// Verify the nonce.
if (!wp_verify_nonce($_POST[\'unsubscribe_from_site_nonce\'], \'unsubscribe-from-site\')) {
return;
}

// Remove the user from the current blog
remove_user_from_blog(get_current_user_id());

// Redirect back to the previous page.
wp_safe_redirect(wp_get_referer());
exit;
}
add_action(\'template_redirect\', \'unsubscribe_from_site\');
在我为正在测试的页面/子站点创建的模板文件中(在本地主机安装上),我使用了以下内容:

<?php
global $current_user, $blog_id;

if (!is_user_logged_in())
    echo \'You are not logged in<br>\';
elseif (is_user_logged_in() && (!current_user_can(\'read\'))) {
    $current_user = wp_get_current_user();
    echo \'<div style="direction:ltr;text-align:center">\' . sprintf(__(\'Hi, %s!\'), esc_html($current_user->display_name)) . \'<br>You are logged in, but you are NOT subscribed to this blog.\';
    echo \'<form method="post" action="\' . esc_url(home_url()) . \'">
        <input name="subscribe" type="submit" id="subscribe-button" value="Subscribe" />\' . wp_nonce_field(\'subscribe-to-site\', \'subscribe_to_site_nonce\') . \'</form></div>\';
} else {
    echo \'<div style="direction:ltr;text-align:center">\' . sprintf(__(\'Hi, %s!\'), esc_html($current_user->display_name)) . \'<br>You are subscribed to this blog.\';
    echo \'<form method="post" action="\' . esc_url(home_url()) . \'">
        <input name="unsubscribe" type="submit" id="unsubscribe-button" value="Unsubscribe" />\' . wp_nonce_field(\'unsubscribe-from-site\', \'unsubscribe_from_site_nonce\') . \'</form></div>\';
}
?>
这两个片段都是受我链接的答案的启发,我留下了原始答案的注释,以防其他人需要相同的功能,并发现它们和我一样有用。

目前,我只在WordPress multisite的本地安装上使用此代码,但我想稍后在实时站点上使用此代码,所以我希望代码可以安全使用。

老实说,我仍然惊讶于它的工作。啊。。。在这样的时刻感到感激。

无论如何,如果你们对如何改进这个答案有任何意见,请分享,因为我是一个初学者,并将感谢你们的帮助和建议。

非常感谢。

相关推荐

本地WordPress MultiSite在AWS开发服务器上不工作“建立数据库连接时出错”

我在本地mac上使用mamp安装了composer WP starter。它按预期工作。我正在使用phpdotenv隐藏我的wp配置。php设置和我将wordpress目录移动到文档根目录下的子目录中。我在本地mac dev2上使用虚拟主机。域名。com。我使用wp db migrate pro查找dev2并将其替换为dev3作为域名。com在本地和AWS上是相同的。唯一的其他区别是数据库连接设置。我知道数据库连接设置是正确的,因为我在运行composer并使用wp cli安装wp的shell脚本中使用了