【问题标题】:Remove action buttons from WooCommerce Subscriptions dashboard for a specific user role从 WooCommerce 订阅仪表板中删除特定用户角色的操作按钮
【发布时间】:2020-05-02 01:21:59
【问题描述】:

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

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


我要做什么:

从特定用户角色中移除“暂停”和“取消”按钮访问权限 (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 隐藏这些按钮,但这可以颠倒过来,不会依赖于用户角色。如果有的话,我愿意以另一种方式解决这个问题!

【问题讨论】:

    标签: php wordpress woocommerce admin woocommerce-subscriptions


    【解决方案1】:

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

    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 文件中。经过测试并且可以工作。

    【讨论】:

    • 太棒了,完美运行!感谢您花时间回答。如果在不久的将来我在更大的项目上需要帮助,我会伸出援手 :) - (ps 我不能给你花 19 小时的赏金)
    • 这只会隐藏操作链接。如果有人直接访问该链接,它将起作用:)
    • 不能说我会在紧要关头使用这个解决方案犹豫不决,但这有点作弊 ;)
    • @CKMacLeod 有时候作弊总比没有好:)
    • 嗨@LoicTheAztec 我试图通过您个人资料中的“联系我”链接与您联系,不确定您是否收到我的消息?
    【解决方案2】:

    到目前为止,没有过滤器可以处理此操作触发器。您可以自行添加过滤器来处理此问题。

    /woocommerce-subscriptions/includes/admin/class-wcs-admin-post-types.php 在此函数中围绕 Line# 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;
    }
    

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

    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;
    }
    

    【讨论】:

    • 您好,感谢您的意见!我刚刚通过将它放在'public function parse_bulk_actions()'下测试了你的代码。然后我在“用户角色编辑器”中添加了“can_change_status”作为自定义功能,并没有选中它。不幸的是,我没有看到变化!我做错了吗?
    • @cactusboat - 在functions.php中添加第二个sn-p
    • 嘿@mujuonly,我刚试过,但它似乎仍然不起作用:(非常感谢你花时间回答我的问题!
    • @cactusboat - 如果有效,请尝试在过滤器函数的开头返回 false。那么您可以确认问题出在角色检查上,否则问题出在您在提到的文件中添加的代码的位置
    • 我在第一个代码中将 true 替换为 false,它什么也没做。我还尝试在“公共函数 parse_bulk_actions()”中重新定位。没有任何改变,VA 支持仍然可以看到取消/暂停
    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2022-11-24
    • 2020-11-19
    • 1970-01-01
    • 2018-10-25
    • 2021-02-03
    相关资源
    最近更新 更多