Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 禁用特定用户角色(参与者和订阅者)的插件_Php_Wordpress - Fatal编程技术网

Php 禁用特定用户角色(参与者和订阅者)的插件

Php 禁用特定用户角色(参与者和订阅者)的插件,php,wordpress,Php,Wordpress,我正在尝试禁用一个基于用户角色的特定插件 我有三种类型的用户角色 小贩 贡献者 管理 我的目标是,如果用户是贡献者,上述插件将被禁用 其他管理员和供应商,激活插件 我编写了以下代码: // Disable Plugins to specific user add_filter( 'option_active_plugins', 'disable_logged_in_plugin' ); function disable_logged_in_plugin( $plugins ) { // T

我正在尝试禁用一个基于用户角色的特定插件

我有三种类型的用户角色

小贩 贡献者 管理 我的目标是,如果用户是贡献者,上述插件将被禁用

其他管理员和供应商,激活插件

我编写了以下代码:

// 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;
}
问题是它不起作用了?分配给角色“参与者”的用户仍然能够使用所述插件

有什么办法让它发挥作用吗?谢谢你在这方面的帮助

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


您将遇到的问题是,验证用户的代码是可插入的,并且在加载所有插件之后才会执行。所以,如果你想阻止一个插件加载,你需要把它放在一个必须使用的插件中。然而,选项_active_plugins过滤从WordPress执行的插件,以确定插件是否应该在可插入函数之前加载。因此,您无法知道该用户是谁来阻止插件加载

换句话说

必须使用插件才能加载 WordPress检查哪些插件应该使用选项\u active\u plugins filter加载 从选项_active_Plugins过滤器返回的常规、非必须使用的插件已加载 可插入的函数,如wp\u set\u current\u user被加载 用户已验证 所以

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

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

如果我是在你的情况下,我会首先尝试看看使用一些删除操作和过滤器的组合,或者劫持插件依赖的过滤器是否可行。如果能够做到这一点,那将是阻力最小的道路


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

您将遇到的问题是,验证用户的代码是可插入的,并且在加载所有插件之后才执行。所以,如果你想阻止一个插件加载,你需要把它放在一个必须使用的插件中。然而,选项_active_plugins过滤从WordPress执行的插件,以确定插件是否应该在可插入函数之前加载。因此,您无法知道该用户是谁来阻止插件加载

换句话说

必须使用插件才能加载 WordPress检查哪些插件应该使用选项\u active\u plugins filter加载 从选项_active_Plugins过滤器返回的常规、非必须使用的插件已加载 可插入的函数,如wp\u set\u current\u user被加载 用户已验证 所以

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

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

如果我是在你的情况下,我会首先尝试看看使用一些删除操作和过滤器的组合,或者劫持插件依赖的过滤器是否可行。如果能够做到这一点,那将是阻力最小的道路

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

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

wp_get_current_user()
然后,您可以在下面的部分中使用该角色作为当前用户的参数。这似乎是一个打字错误,应该是

contributor 
而不是

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

if ( current_user_can('contributor') ) {

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

wp_get_current_user()
然后,您可以在下面的部分中使用该角色作为当前用户的参数。这似乎是一个打字错误,应该是

contributor 
而不是

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

if ( current_user_can('contributor') ) {

您可以通过停用该用户角色的插件来实现这一点

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');
或者,如果您不介意使用插件,您可以尝试“插件管理器”插件,该插件支持根据用户角色停用插件


转到Plugin Organizer settings(插件管理器设置)页面,选中您希望禁用/启用插件的每个角色旁边的复选框。然后,后期编辑屏幕上将显示一个单独的容器,供您使用禁用/启用插件。

您可以通过禁用该用户角色的插件来实现这一点

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');
或者,如果您不介意使用插件,您可以尝试“插件管理器”插件,该插件支持根据用户角色停用插件


转到Plugin Organizer settings(插件管理器设置)页面,选中您希望禁用/启用插件的每个角色旁边的复选框。然后,一个单独的容器将出现在后期编辑屏幕上,供您禁用/启用插件。

您是否可以确认disable_logged_in_插件正在实际执行,并且您正在为此使用一个必用插件?不,它没有执行。我开始编写响应的代码中有几个问题,但后来我意识到我不确定你到底想做什么。默认情况下,这些角色的用户不应该能够看到插件列表,所以我不认为您试图隐藏插件,对吗?相反,您不想使用它的功能?您现在要使用的代码路径是全局路径。如果您更改$plugins数组并返回它,它将被保存到数据库中供所有人使用,包括管理员。你想把它藏在菜单里吗?@ChrisHaas,我修改了我的问题来描述我的目标是什么。谢谢,谢谢@BenDaggers。插件要么是活动的,要么不是,实际上没有一个有条件的活动模式。所有插件都会很早通过调用启动,这是一个不可过滤的调用,取消启动插件不是WordPress的概念。相反,我真的认为你想限制对该插件功能的访问,对吗?你能确认disable_logged_in_插件实际上正在执行,并且你正在为此使用一个必用插件吗?不,它没有执行。我开始写响应的代码中有几个问题,但后来我意识到我不确定你到底想做什么。默认情况下,这些角色的用户不应该能够看到插件列表,所以我不认为您试图隐藏插件,对吗?相反,您不想使用它的功能?您现在要使用的代码路径是全局路径。如果您更改$plugins数组并返回它,它将被保存到数据库中供所有人使用,包括管理员。你想把它藏在菜单里吗?@ChrisHaas,我修改了我的问题来描述我的目标是什么。谢谢,谢谢@BenDaggers。插件要么是活动的,要么不是,实际上没有一个有条件的活动模式。所有插件都会很早通过调用启动,这是一个不可过滤的调用,取消启动插件不是WordPress的概念。相反,我真的认为您想限制对该插件功能的访问,对吗?在所需选项“活动插件”运行时,wp_get_current_user和current_user_can函数不可用。用户是在第一次调用选项\u active\u plugins runs后定义的。您将如何解决该问题?在运行所需选项的活动插件时,wp_get_current_user和current_user_can函数不可用。用户是在第一次调用选项\u active\u plugins runs后定义的。你将如何解决这个问题?我不相信作者的意思是说基于他们的问题。听起来他们想阻止装载。微妙但巨大的区别,因为如果你不断地激活和停用插件,你就为自己设置了重大问题。我认为你关于插件管理器的建议值得研究,但他们再次警告:重新排序或禁用插件可能会对你的网站造成灾难性影响。它可能会导致插件出现问题,并使您的站点无法访问。。这可能会比它的价值更麻烦:这是我在回答中提到的,但我仍然认为它是非生产环境的一个很酷的插件。谢谢你的建议!95%的时候,我认为不会有问题。大多数插件在停用时不做任何事情。主要更改在卸载时启动,而不是停用。如果是som
您担心的是,您可以“静默”停用阻止调用停用挂钩的插件。默认情况下,该参数设置为false,但您可以像这样调用deactivate_插件使其保持静默。停用插件“/woocommerce pay per post/woocommerce pay per post.php”,true;我也不建议定期这样做,我只是认为在这种情况下,考虑到这是一个功能有限的插件,用户角色是独特的和特定的,这样做可能是安全的。我不相信作者的意思是说根据他们的问题停用。听起来他们想阻止装载。微妙但巨大的区别,因为如果你不断地激活和停用插件,你就为自己设置了重大问题。我认为你关于插件管理器的建议值得研究,但他们再次警告:重新排序或禁用插件可能会对你的网站造成灾难性影响。它可能会导致插件出现问题,并使您的站点无法访问。。这可能会比它的价值更麻烦:这是我在回答中提到的,但我仍然认为它是非生产环境的一个很酷的插件。谢谢你的建议!95%的时候,我认为不会有问题。大多数插件在停用时不做任何事情。主要更改在卸载时启动,而不是停用。如果这是您担心的事情,您可以“静默地”停用一个阻止调用停用挂钩的插件。默认情况下,该参数设置为false,但您可以像这样调用deactivate_插件使其保持静默。停用插件“/woocommerce pay per post/woocommerce pay per post.php”,true;我也不建议定期这样做,我只是认为在这种情况下,考虑到这是一个功能有限的插件,并且用户角色是唯一和特定的,这样做可能是安全的。