我正尝试根据用户角色禁用特定的插件(Woocommerce Pay Per Post)。
我有三种类型的用户角色。
我的目标是,如果用户是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;
}
问题是它不起作用?分配给角色“贡献者”的用户仍设法使用了该插件...
有什么想法可以使它起作用吗?感谢您的帮助。
这是该插件文件夹及其内容的屏幕截图。
答案 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执行以确定是否应加载插件的过滤器)在可插入函数之前发生。因此,您无法知道该用户是谁来阻止插件加载。
换句话说
option_active_plugins
过滤器加载哪些插件option_active_plugins
过滤器返回的wp_set_current_user
)已加载所以...
您需要做的第一件事是将代码放入必须使用的插件中。那是个好消息。坏消息是,您将需要找到一种以自己的方式验证用户的方法。它必须是某种形式的黑客,您在这方面没有太多选择。您可以尝试创建一个PHP SESSION,用于存储用户信息(或仅存储功能等)。而且,每次用户更改时,您都需要将其与WordPress同步。然后,一旦加载了可插拔用户功能,您就必须针对该PHP SESSION进行验证。如果没有抛出错误,应该使用健全性检查来确保它们相同。
@ChrisHaas指出的另一种选择是与插件作者联系以获取指导,或者浏览该插件代码以查看是否有任何可以/想要取消的操作/过滤器。我意识到这两个选项(或我的主要答案)都不理想,但是因为WordPress允许插件确定如何验证用户 。你陷入了一个悖论。
如果遇到这种情况,我将首先尝试查看使用插件依赖的删除动作和过滤器(或劫持过滤器)的某种组合是否可行。如果可以的话,将是阻力最小的路径。
(此外,为清楚起见,我想您想说的是,您希望在某些情况下阻止插件加载而不是禁用它)。