从 WooCommerce 订阅仪表板中删除特定用户角色的操作按钮

Remove action buttons from WooCommerce Subscriptions dashboard for a specific user role

我希望使用虚拟助手来帮助管理支持票。该虚拟助手需要对 WooCommerce 的有限区域具有阅读权限(订阅)。

我正在使用“用户角色编辑器”删除所有不需要的功能。不幸的是,单个功能 (edit_shop_orders) 允许访问我不希望代理访问的功能。我被迫授予代理此权限以访问后端的订阅菜单。


我想做什么:

删除特定用户角色的 'Suspend' 和 'Cancel' 按钮访问权限 (va_support)



我当前的代码(不工作):

function change_va_support_role(){
    global $wp_roles;
    $wp_roles->remove_cap( 'va_support', 'suspend_subscriptions' );
    $wp_roles->remove_cap( 'va_support', 'cancel_subscriptions' );

}
add_action('init', 'change_va_support_role');

我假设我输入了错误的功能,但我似乎无法在任何地方找到它们。
我知道 我可以很容易地用 CSS 隐藏这些按钮,但这只能被逆转并且不会依赖于用户角色。如果有的话,我愿意以另一种方式解决这个问题!

截至目前,处理此操作触发器的地方没有过滤器。您可以自己添加一个过滤器来处理这个问题。

/woocommerce-subscriptions/includes/admin/class-wcs-admin-post-types.php 在第 330 行附近的函数内 - public function parse_bulk_actions()

/*
 * Use below hook for handling custom user role permission for action from subscription listing page
 */
$can_change_status = apply_filters('wcs_can_change_subscription_status', true, $subscription_ids);
if(!$can_change_status){
    return;
}

在主题中,您可以检查当前用户是否具有相应的角色,然后return true/false。您可能知道更新插件时,所做的更改将会丢失。但是就检查代码而言,在触发这些函数之前没有过滤器。

add_filter( 'wcs_can_change_subscription_status', 'alter_can_change_subscription_status' );

function alter_can_change_subscription_status( $can_change_status ) {

    $user = wp_get_current_user();
    if ( in_array( 'va_support', (array) $user->roles ) ) {
        //The user has the "va_support" role
        return false;
    }
    return  $can_change_status;
}

使用 Javascript / jQuery 以下内容将删除所有 "hovered" 操作按钮,针对特定用户角色,在订阅管理仪表板上的状态列中:

add_action( 'admin_footer', 'admin_dashboard_subscriptions_filter_callback' );
function admin_dashboard_subscriptions_filter_callback() {
    global $pagenow, $post_type;

    $targeted_user_role = 'va_support'; // <== Your defined user role slug

    // Targeting subscriptions admin dashboard for specific user role
    if( $pagenow === 'edit.php' && $post_type === 'shop_subscription' 
    && current_user_can( $targeted_user_role ) ) :
    ?>
    <script>
    jQuery(function($){
        $('td.column-status > div.row-actions').each(function() {
            $(this).remove();
        });
    });
    </script>
    <?php
    endif;
}

代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。