【问题标题】:Disable Plugin for specific User Role (Contributor & Subscriber)禁用特定用户角色的插件(贡献者和订阅者)
【发布时间】:2020-06-22 04:00:18
【问题描述】:

我正在尝试根据用户角色禁用特定插件(Woocommerce Pay per Post)。

我有三种类型的用户角色。

  1. 供应商
  2. 贡献者
  3. 管理员

我的目标是如果用户是 CONTRIBUTOR,则上述插件(Woocommerce Pay per Post)将被禁用。

ELSE(管理员和供应商),激活插件。

我已经写了这段代码:

// Disable Plugins to specific user

add_filter( 'option_active_plugins', 'disable_logged_in_plugin' );

function disable_logged_in_plugin( $plugins ) {

// The 'option_active_plugins' hook occurs before any user information get generated,
// so we need to require this file early to be able to check for logged in status
require (ABSPATH . WPINC . '/pluggable.php');

// If we are logged in, and NOT an admin...
if ( current_user_can('Contributor') ) {

    // Use the plugin folder and main file name here.
    // is used here as an example
       $plugins_not_needed = array ('/woocommerce-pay-per-post/woocommerce-pay-per-post.php');
        foreach ( $plugins_not_needed as $plugin ) {
            $key = array_search( $plugin, $plugins );
            if ( false !== $key ) {
                unset( $plugins[ $key ] );
            }
        }
    }

    return $plugins;
}

问题是它不工作?分配给角色“贡献者”的用户仍然设法使用上述插件...

任何想法让它工作?感谢您在这方面的帮助。

这是该插件文件夹及其内容的屏幕截图。

【问题讨论】:

  • 您能否确认disable_logged_in_plugin 确实在执行并且您为此使用了必须使用的插件?
  • 不,它没有执行。
  • 您的代码存在一些问题,我开始编写响应,但后来我意识到我实际上并不确定您要做什么。默认情况下,这些角色的用户应该看不到插件列表,所以我认为您不是在尝试隐藏插件,对吧?相反,您不想使用它的功能吗?您现在要走的代码路径是全局路径。如果您更改 $plugins 数组并返回它,它将被保存到数据库中,供所有人使用,包括管理员。你想把它隐藏在菜单中吗?
  • @ChrisHaas,我修改了我的问题以描述我的目标。谢谢。
  • 谢谢@BenDaggers。插件要么处于活动状态,要么不处于活动状态,实际上没有“条件活动模式”。所有插件都会通过调用wp_get_active_and_valid_plugins 很早就启动,这是一个不可过滤的调用,并且“取消启动”插件不是 WordPress 概念。相反,我真的认为您想限制对该插件功能的访问,对吧?

标签: php wordpress


【解决方案1】:

您的代码应该可以工作,但您可以使用

检查您登录用户的角色
wp_get_current_user()

然后您可以在下一节中将该角色用作 current_user_can() 的参数。而且好像打错了,应该是

contributor 

而不是

Contributor

所以改变这个区域可能会对你有所帮助

if ( current_user_can('contributor') ) {

【讨论】:

  • wp_get_current_user(和current_user_can)函数在所需的option_active_plugins 运行时不可用。在第一次调用option_active_plugins 运行后定义用户。你会如何解决这个问题?
【解决方案2】:

您可以通过停用该用户角色的插件来实现此目的。

function deactivate_wppp_based_on_role() {
    global $current_user;
    if (in_array('contributor', $current_user->roles)) {
        deactivate_plugins( '/woocommerce-pay-per-post/woocommerce-pay-per-post.php' );
    } else { 
        activate_plugins( '/woocommerce-pay-per-post/woocommerce-pay-per-post.php' );
    }
}
add_action('admin_init', 'deactivate_wppp_based_on_role');

或者,如果您不介意使用插件,您可以尝试“插件管理器”插件,该插件支持根据用户角色停用插件。 https://wordpress.org/plugins/plugin-organizer/

转到插件管理器设置页面并选中您希望能够禁用/启用插件的每个角色旁边的框。然后,帖子编辑屏幕上将出现一个单独的容器,供您禁用/启用插件。

【讨论】:

  • 我不相信作者的意思是根据他们的问题说“停用”。听起来他们打算“防止加载”。微妙但巨大的差异,因为如果你不断地“激活”和“停用”,你就会为重大问题做好准备。
  • 我认为您对“插件管理器”的建议值得研究,但他们甚至再次指出“警告:重新排序或禁用插件可能会对您的网站产生灾难性影响。它可能会导致插件出现问题并且可能使您的网站无法访问。”。这可能会比它的价值更麻烦:(这是我在回答中提到的,但我仍然认为它是非生产环境的一个很酷的插件。谢谢你的建议!
  • 95% 的时间,我认为不会有问题。大多数插件在停用时不做任何事情。重大更改在卸载时启动,而不是在停用时启动。如果这是您担心的事情,您可以“静默”停用一个插件,以防止调用停用挂钩。默认情况下,该参数设置为 false,但您可以像这样调用deactivate_plugins 使其静音。 deactivate_plugins( '/woocommerce-pay-per-post/woocommerce-pay-per-post.php', true);
  • 我也不推荐这是应该定期做的事情,我只是认为在这种情况下,考虑到这是一个功能有限的插件插件,并且用户角色是独一无二的具体来说,这样做可能是安全的。
【解决方案3】:

您将遇到的问题是验证用户的代码是“可插入的”,并且在加载所有插件之后才会执行。因此,如果您想阻止插件加载,则需要将其放入必须使用的插件中。但是,option_active_plugins 过滤器(从 WordPress 执行以确定是否应加载插件的过滤器)发生在可插入函数之前。因此,您无法知道该用户是谁来阻止插件加载。

换句话说

  1. 加载必须使用的插件
  2. WordPress 通过option_active_plugins 过滤器检查应该加载哪些插件
  3. (常规,非必须使用)从option_active_plugins 过滤器返回的插件被加载
  4. 加载可插入函数(如wp_set_current_user
  5. 用户已通过验证

所以...

您需要做的第一件事是将代码放入必须使用的插件中。这就是好消息。坏消息是您需要找到一种以您自己的方式验证用户的方法。它必须是某种黑客,你在这件事上没有太多选择。您可以尝试创建一个存储用户信息(或只是功能等)的 PHP SESSION。每次用户更改时,您都需要将其与 WordPress 同步。然后,您必须在加载后针对可插入用户函数验证 PHP SESSION。应该使用完整性检查来确保它们相同,如果不抛出错误。

@ChrisHaas 指出的另一个选项是联系插件作者寻求指导,或者查看该插件代码以查看是否有任何您可以/想要取消设置的操作/过滤器。我意识到这两个选项(或我的主要答案)都不是理想的,但是因为 WordPress 允许插件来确定如何验证用户可以。你陷入了一个悖论。

如果我遇到您的情况,我会首先尝试看看使用删除操作和插件所依赖的过滤器(或劫持过滤器)的某种组合是否可行。如果它可以完成,那是阻力最小的路径。

(另外,为了清楚起见,我认为您想说您想阻止插件在某些情况下加载而不是禁用它)。

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 2021-07-23
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多