按角色限制woocommerce订单状态

时间:2017-09-23 03:32:28

标签: php wordpress woocommerce status orders

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

我发现的最近的是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(); ?>

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

任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:0)

不建议用户角色使用条件函数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();
?>

经过测试和工作