在WooCommerce管理页面中仅显示本地订单

时间:2019-03-30 09:56:59

标签: php wordpress function woocommerce

在我的商店中,客户可以从多个位置购买相同的产品。每个地点都有自己的shop_manager,因此我希望每个shop_manager只能看到所选变体与其位置匹配的订单(例如,来自明尼苏达州的“ shop_manager_min”只能看到已选择变体“ min”的订单;“ shop_manager_tex”,来自德克萨斯州的订单,只能看到带有“ tex”变化的订单,依此类推。

为此,我尝试了下一个代码:

    add_filter( 'pre_get_posts', 'orders_by_location' );
    function orders_by_location( $query ) {
//check if user role is shop_manager to continue
        if(isset(wp_get_current_user()->roles[0]) && wp_get_current_user()->roles[0] == 'shop_manager'){
//gets the 3 character string code for the shop manager location
            $location = substr(wp_get_current_user()->user_login, -3);
//query for all the orders where the variation matches the shop manager location
            $query->set( 'meta_query', array( 
                          array( 
                                  'key' => 'attribute_pa_location', 
                                  'value' => $location, 
                                  'compare' => '=' 
            ) ) );  
        return $query; }}

但是,此查询没有任何帮助,没有显示任何订单。我在做什么错了?


我尝试了下一个查询以按位置订购订单,它运行得非常完美:

add_filter( 'pre_get_posts', 'orders_by_location' );
function orders_by_location( $query ) {
    if(isset(wp_get_current_user()->roles[0]) && wp_get_current_user()->roles[0] == 'shop_manager'){
        $query->set('orderby', 'attribute_pa_location' );
        $query->set('order', 'DESC' );
        return $query; }}

与前面的一样,我看到attribute_pa_location存在并且可以通过查询访问。我还回显了attribute_pa_location值和$ location中的值,两者完全相同!!!但是,查询没有提供任何回报,并且shop_manager管理员订单页面中没有显示任何订单。


我使用_customer_user而不是attribute_pa_sede进行了相同的第一次查询,并且运行良好。如果查询过程很好并且meta键也很好,那么当我一起使用它们时为什么不起作用??

1 个答案:

答案 0 :(得分:0)

我最终发现问题在于属性位置不是订单属性的一部分(而是产品属性的一部分)。作为解决方法,我在结帐时使用functions.php中的下一个动作将位置复制到了交易ID中:

add_action( 'woocommerce_checkout_create_order', 'update_order_id', 30, 2 );
function update_order_id( $order, $posted_data ) {
    foreach ( $order->get_items() as $item ) {$location = $item->get_meta("pa_location");}
    $order->set_transaction_id($location); }

之后,我只是查询:

add_action( 'pre_get_posts', 'orders_by_location', 100 );
function orders_by_location( $query ) {
    if(isset(wp_get_current_user()->roles[0]) && wp_get_current_user()->roles[0] == 'shop_manager'){
        $location = substr(wp_get_current_user()->user_login, -3);
        $query->set('post_type', 'shop_order' );
        $query->set('post_status', array('wc-on-hold', 'wc-processing') );
        $query->set('meta_key', '_transaction_id' );
        $query->set('meta_value', $location ); } 
    return $query; }