Woocommerce wp_query 按 ID 获取订单

Posted

技术标签:

【中文标题】Woocommerce wp_query 按 ID 获取订单【英文标题】:Woocommerce wp_query get order by ID 【发布时间】:2017-07-08 03:32:14 【问题描述】:

我正在尝试生成订单数据的普通输出。第一步是 WP_QUery(也许)所以我写了这段代码;

$args = array (

    'post_type'  =>'shop_order',
    'posts_per_page' => -1,
    'post_status' => 'any',
    //'p' => $post_id,

);    

$order_query = new WP_Query( $args );

while ( $order_query->have_posts() ) :
  $order_query->the_post(); 

  echo the_ID();
  echo ' : '; 
  the_title();
  echo '<br/><br/>';

endwhile;

它要求产品列出所有订单,如果我设置'p' =&gt; $post_id 其中$post_id 是有效的帖子ID,则查询不返回任何内容。

知道为什么吗,蜂巢思维?

或者,有一种 Woocommerce 方法可以生成具有类似布局的普通页面;

Order ID: 836
Order Status: ....

我认为 WP_Query 将是显而易见的方式,但似乎获取 woocommerce 订单数据绝非易事。

【问题讨论】:

作为背景,我有一个 Filemaker 数据库,可以解析来自 Romancart 购物解决方案的电子邮件,我可以。当然,解析来自 Woocommerce 的订单电子邮件,但我认为我会更聪明一点,并通过网页传递数据。当然,ESS 是最好的解决方案,但它也需要大量编程。 这可能对***.com/a/28847572/1182891有帮助 【参考方案1】:

更新 2

要获取一个订单的订单数据,您不需要WP_query。可以直接使用:

$order = wc_get_order( $order_id );
$order->id; // order ID
$order->post_title; // order Title
$order->post_status; // order Status
// getting order items
foreach($order->get_items() as $item_id => $item_values)
    // Getting the product ID
    $product_id = $item_values['product_id'];
    // .../...


更新 1

您应该试试这个,就像 array_keys( wc_get_order_statuses() 一样,您将获得所有订单状态,而 'numberposts' =&gt; -1, 将获得所有现有订单。

这是另一种方式(没有 WP_query 或者您可以在 WP_query 数组中使用这些参数):

$customer_orders = get_posts( array( 
    'numberposts'    => -1,
    'post_type' => 'shop_order',
    'post_status'    => array_keys( wc_get_order_statuses() ) 
) );

// Going through each current customer orders
foreach ( $customer_orders as $customer_order ) 

    // Getting Order ID, title and status
    $order_id = $customer_order->ID;
    $order_title = $customer_order->post_title;
    $order_status = $customer_order->post_status;

    // Displaying Order ID, title and status
    echo '<p>Order ID : ' . $order_id . '<br>';
    echo 'Order title: ' . $order_title . '<br>';
    echo 'Order status: ' . $order_status . '<br>';

    // Getting an instance of the order object
    $order = wc_get_order( $order_id );

    // Going through each current customer order items
    foreach($order->get_items() as $item_id => $item_values)
        // Getting the product ID
        $product_id = $item_values['product_id'];
        // displaying the product ID
        echo '<p>Product ID: '.$product_id.'</p>';
    

【讨论】:

'post_status'=&gt;'any' 可以解决问题,返回所有帖子不是问题。返回一篇文章是我的目标,请参阅上面的答案。不过还是感谢您花时间回答。【参考方案2】:

这个问题的严格答案是把'p'=&gt;$post_id'改成'post__in' =&gt; array($post_id)

...但是,如果有人走这条路,真正的答案是解析电子邮件要容易得多,woocommerce 已经为您完成了大部分工作。一路上还有其他错误。 1. 帖子受到保护,订单注释在摘录中,因此无法显示(我可以将它们移动到 meta 但是......) 2. 订单项目在 cmets 内,必须循环然后解析以产生有意义的输出,所以我还不如直接解析邮件。

【讨论】:

值得注意的是,因为将 Woocommerce 数据移动到 Filemaker 是人们可能想要做的事情,单个 Woocommerce 订单是相互关联的表条目的缠结这一事实意味着任何解决方案都会变得复杂并且订单电子邮件可能是现有订单中完整数据集的最佳有序摘要。 你的问题很不清楚......我不明白你是想打电话给一个订单。你最好直接使用这个$order = wc_get_order( $order_id );……不需要查询……然后如果你print_r($order)你会看到你可以得到一切……我已经更新了我的答案2次。

以上是关于Woocommerce wp_query 按 ID 获取订单的主要内容,如果未能解决你的问题,请参考以下文章

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

在 Woocommerce 上的 WP_query 中获取目录中可见的产品

WP_Query Woocommerce 产品仅属于不同的多个类别 tax_query

WooCommerce 按 id 返回产品对象

sql 获取WooCommerce按产品/邮政ID或产品SKU获取订单ID

如何按ID排序不随机化Woocommerce的相关产品