具有待处理状态问题的 WP_Query 和 WooCommerce 订单

Posted

技术标签:

【中文标题】具有待处理状态问题的 WP_Query 和 WooCommerce 订单【英文标题】:WP_Query and WooCommerce orders with pending status issue 【发布时间】:2017-06-16 13:37:15 【问题描述】:

我无法获取状态为 wc-pending / Pending Payment 的订单对象。它只是返回所有订单对象:

$my_course_query = new WP_Query( array(
    'post_type'     => 'shop_order',
    'post_status'   => 'wc-pending',
    'posts_per_page'      => -1
) );

【问题讨论】:

【参考方案1】:

您的代码在前端工作正常,我已经对其进行了测试,它只输出带有 **pending 状态的订单。由于您的问题不详细,所以我无法判断您的问题是什么。

我在WordPress WP_Query reference 上发现了这个可能有用的注释: 注意:Ticket #18408 对于在后台查询帖子,请考虑使用 get_posts(),因为 wp_reset_postdata() 可能无法按预期运行。

一般来说,我不使用 WP_Query() 来处理客户订单,但 wc_get_orders() (或 get_posts() 也是)方式:

$customer_orders = wc_get_orders( array(
    'limit'    => -1,
    'status'   => 'pending'
) );

// Iterating through each Order with pending status
foreach ( $customer_orders as $order ) 

    // Going through each current customer order items
    foreach($order->get_items() as $item_id => $item_values)
        $product_id = $item_values['product_id']; // product ID

        // Order Item meta data
        $item_meta_data = wc_get_order_item_meta( $item_id );

        // Some output
        echo '<p>Line total for '.wc_get_order_item_meta( $item_id, '_line_total', true ).'</p><br>';
    

这也适用于获取订单对象。

相关文档:wc_get_orders and WC_Order_Query

【讨论】:

嗨,知道如何在使用 wc_get_orders 时避免获取 WC_Order_Refund 对象吗?实际上我依赖于循环内的测试(例如:$order-&gt;get_type() !=='shop_order_refund')但我想知道是否有更好的方法在查询中使用一些 magic @TemaniAfif 添加参数type 喜欢'type' =&gt; 'shop_order' 以避免退款订单... 好的,谢谢,我不知道我是怎么从文档中漏掉的 -.- 我专注于状态参数。【参考方案2】:

我通过简单地使用自定义查询解决了这个奇怪的问题。

不知何故添加'post_status' =&gt; 'wc-pending'实际上并没有改变查询,但如果我使用'post_status' =&gt; 'pending',查询就会改变。

所以我所做的是使用该自定义查询并将pending 修改为wc-pending

【讨论】:

【参考方案3】:

我在调试时确实遇到了同样的问题(返回所有订单)。

将调试代码包装成一个动作有助于输出预期的数据:

add_action( 'init', 'debug_init' );

function debug_init() 

    $custom_query_args = array(
        "fields" => "ids",
        "post_type" => "shop_order",
        "post_status" => array('wc-processing'),
        "posts_per_page" => "-1",
        "offset" => "0",
        "date_query" => [
                "before" => "2020-09-10 23:59",
                "after" => "1970-01-01 00:00",
                "inclusive" => "1"
        ],
        "order" => "DESC"
    );


    $debugQuery = new WP_Query( $custom_query_args );
    $order_ids   = $debugQuery->posts;

    print_r($order_ids);

    die();

【讨论】:

以上是关于具有待处理状态问题的 WP_Query 和 WooCommerce 订单的主要内容,如果未能解决你的问题,请参考以下文章

付款状态保持“待处理”

php 默认结算状态#woo

PayPal REST SDK:删除送货地址和付款授权,使其进入待处理状态[关闭]

如何让待处理状态自动显示?

为啥一个已解决的承诺仍处于待处理状态?

如何检查 Promise 是不是处于待处理状态 [重复]