【问题标题】:Restrict woocommerce order status by role按角色限制 woocommerce 订单状态
【发布时间】:2018-03-04 16:25:28
【问题描述】:

我正在尝试创建一个工作流程,商店经理可以创建订单并将其标记为“待付款”、“处理中”,但只有管理员可以将订单标记为“完成”、“失败”等。

我找到的最接近的是this post:

<?php 
if ( current_user_can(! 'administrator' ) ) {
$args = array( 'post_type' => 'post', 'post_status' => 'publish, pending, 
draft' );
} else {
$args = array( 'post_type' => 'post', 'post_status' => 'publish' );
}
$wp_query = new WP_Query($args); while ( have_posts() ) : the_post(); ?>
CONTENT
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

这应该适用于常规的 WP 帖子(虽然我还没有测试过),但我不确定如何申请 Woocommerce。我的最佳猜测是:

<?php 
if ( current_user_can(! 'administrator' ) ) {
$args = array( 'post_type' => 'shop_order', 'order_status' => 'complete,failed' );
} else {
$args = array( 'post_type' => 'shop_order', 'post_status' => 'pending-payment,processing' );
}
$wp_query = new WP_Query($args); while ( have_posts() ) : the_post(); ?>
CONTENT
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

但是我遇到了各种各样的错误!我也不确定它是否仅适用于编辑订单屏幕,而不适用于管理车间订单表批量操作下拉菜单。

任何帮助将不胜感激!

【问题讨论】:

  • 除了管理员角色之外,您是否授予对 wp 管理仪表板的访问权限?或者您正在创建任何前端页面来列出所有订单和状态更新?
  • 我应该把这些代码放在哪里?

标签: php wordpress woocommerce status orders


【解决方案1】:

不建议用户角色使用条件函数current_user_can()

虽然部分支持检查特定角色来代替能力,但不鼓励这种做法,因为它可能会产生不可靠的结果。

相反,您可以获得当前用户和他的角色(因为一个用户可以有很多)。 此外,woocommerce 中的订单发布状态非常具体(它们都以 wc- 开头,如果很多,它们应该在一个数组中)。

所以正确的代码应该是:

<?php 
    // get current user roles (if logged in)
    if( is_user_logged_in() ){
        $user = wp_get_current_user();
        $user_roles = $user->roles;
    } else $user_roles = array();

    // GET Orders statuses depending on user roles
    if ( in_array( 'shop_manager', $user_roles ) ) { // For "Shop Managers"
        $statuses = array( 'wc-pending','wc-processing' );
    } elseif ( in_array( 'administrator', $user_roles ) ) { // For admins (all statuses)
        $statuses = array_keys(wc_get_order_statuses());
    } else 
        $statuses = array();

    $loop = new WP_Query( array(
        'post_type'      => 'shop_order',
        'posts_per_page' => -1,
        'post_status'    => $statuses
    ) );

    if ( $loop->have_posts() ):
    while ( $loop->have_posts() ):
    $loop->the_post();
?>

<?php echo $loop->post->ID .', '; // Outputting Orders Ids (just for test) ?>

<?php
    endwhile;
    endif;
    wp_reset_postdata();
?>

经过测试和工作

【讨论】:

  • 感谢洛伊克!我测试了代码减去 post->ID 测试。它似乎对状态没有任何影响——我检查的所有角色仍然能够编辑所有状态。不知道我做错了什么,但我不明白你的代码的哪一部分限制了用户的状态。谢谢
  • @charliechina 好的,我做了一个小更新,请参见下面的行:// GET Orders statuses depending on user roles ... 在那里,订单状态根据用户角色有条件地启用。
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2017-05-24
  • 2019-08-11
  • 1970-01-01
  • 2019-07-18
  • 2017-08-14
相关资源
最近更新 更多