如何停用某些角色的插件

时间:2017-04-26 作者:Nathan

我已经尝试了这个插件BP活动共享,但它似乎不起作用。。。这就是我所拥有的,我错在哪里?

/**disable the BP Activity share for all except admin**/
add_action(\'admin_init\', \'my_filter_the_plugins\');    
function my_filter_the_plugins()
{
    global $current_user;
    if (in_array(\'Participant\', \'Subscriber\', $current_user->roles)) {
        deactivate_plugins( // deactivate for participant and subscriber
            array(
                \'/bp-activity-share/bp-activity-share.php\'
            ),
            true, // silent mode (no deactivation hooks fired)
            false // network wide)
       );
    } else { // activate for those than can use it
        activate_plugins(
            array(
                \'/bp-activity-share/bp-activity-share.php\'
            ),
            \'\', // redirect url, does not matter (default is \'\')
            false, // network wise
            true // silent mode (no activation hooks fired)
        );
    }
}

4 个回复
SO网友:Tom J Nowell

这实际上是一个基本的PHP问题:

if (in_array(\'Participant\', \'Subscriber\', $current_user->roles)) {
不是这样的in_array 作品in_array 检查第一位是否在第二位。也是这样Participant 在…内$current_user->roles.

然而,你所写的检查Participant 在里面Subscriber, 然后传递一个数组作为第三个参数,这意味着truefalse 价值

相反,执行2in_array checks和check都是true,例如。

if ( in_array(\'example\', $current_user->roles) || in_array(\'example2\', $current_user->roles) ) {
我还要指出,您发布的代码应该生成PHP警告和通知。打开WP_DEBUG 它应该把这些打印出来。

这会起作用吗

您一直在研究的原始答案存在重大问题,如Mark Kapluns answer. 一旦加载了一个插件,就太晚了,停用它只会对下一个页面加载起作用,如果该页面加载是管理员的话,那将是一片混乱。

因此,您有两种选择:

在插件的最顶端进行检查,如果不想加载插件,请返回。插件不会被停用,但其所有代码都不会运行

SO网友:Mark Kaplun

你不能这样停用插件。您的代码实际要做的(正如@tom所指出的,现在您的检查是错误的)是禁用/启用next request being handled, not the current one.

一旦PHP文件是“必需”的,就不能“取消”它,删除该功能的唯一方法是删除它对操作和过滤器所做的任何订阅。

可能获得类似功能的唯一方法是禁用插件,并在条件合适时需要其主文件。

SO网友:bueltge

您可以使用in_array 函数来解决此问题。自定义函数可帮助您解决问题,而无需使用复杂的条件检查。

应使用以下小功能进行如下检查:if ( _fb_recursive_in_array(\'Participant\', \'Subscriber\', $current_user->roles ) ) { ...

/**
 * Recursive search in array.
 *
 * @param string $needle
 * @param array  $haystack
 *
 * @return bool
 */
function _fb_recursive_in_array( $needle, $haystack ) {

    if ( \'\' === $haystack ) {
        return FALSE;
    }

    if ( ! $haystack ) {
        return FALSE;
    }

    foreach ( $haystack as $stalk ) {
        if ( $needle === $stalk
            || ( is_array( $stalk )
                && _fb_recursive_in_array( $needle, $stalk )
            )
        ) {
            return TRUE;
        }
    }

    return FALSE;
}

SO网友:Nathan

汤姆,谢谢你的解释和建议。

它帮助我让它工作了工作解决方案:

add_action(\'admin_init\', \'my_filter_the_plugins\');    
function my_filter_the_plugins()
{
    global $current_user;
if ( in_array(\'participant\', $current_user->roles) || in_array(\'subscriber\', 
$current_user->roles) ) {
        deactivate_plugins( // deactivate for participant and subscriber
            array(
                \'/bp-activity-share/bp-activity-share.php\'
            ),
            true // silent mode (no activation hooks fired)
       );
    } else { // activate for those than can use it
        activate_plugins(
            array(
                \'/bp-activity-share/bp-activity-share.php\'
            ),
            \'\', // redirect url, does not matter (default is \'\')
            false // network wide)
        );
    }
}