禁用特定用户角色(贡献者和订阅者)的插件

时间:2020-06-22 04:00:18

标签: php wordpress

我正尝试根据用户角色禁用特定的插件(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;
}

问题是它不起作用?分配给角色“贡献者”的用户仍设法使用了该插件...

有什么想法可以使它起作用吗?感谢您的帮助。

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

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:3)

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

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

然后,您可以在以下部分中将该角色用作current_user_can()的参数。而且似乎是错字,应该是

contributor 

代替

Contributor

因此更改此区域可能会对您有所帮助

if ( current_user_can('contributor') ) {

答案 1 :(得分: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/

转到“插件管理器设置”页面,然后选中要禁用/启用插件的每个角色旁边的框。然后,一个单独的容器将显示在帖子编辑屏幕上,供您禁用/启用插件。

答案 2 :(得分:1)

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

换句话说

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

所以...

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

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

如果遇到这种情况,我将首先尝试查看使用插件依赖的删除动作和过滤器(或劫持过滤器)的某种组合是否可行。如果可以的话,将是阻力最小的路径。

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