Запрос Woocommerce wp получить заказ по идентификатору


Я пытаюсь создать простой вывод данных заказа. Первый шаг - это 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' => $post_id, где $post_id - допустимый идентификатор записи, запрос ничего не вернет.

Есть идеи, почему, коллективный разум?

В качестве альтернативы существует ли способ создания простой страницы Woocommerce с таким макетом, как;

Order ID: 836
Order Status: ....

Я предположил, что WP_Query будет очевидным способом, но это похоже на получение данные о заказах woocommerce совсем не просты.

Author: LoicTheAztec, 2017-02-18

2 answers

Обновление 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' => -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>';
    }
}
 4
Author: LoicTheAztec, 2017-02-18 18:01:44

Строгий ответ на этот вопрос - изменить 'p'=>$post_id' на 'post__in' => array($post_id)

...но реальный ответ, если кто-то пойдет по этому пути, заключается в том, что разбор электронной почты намного проще, woocommerce сделал большую часть работы за вас. На этом пути есть и другие ошибки; 1. Сообщение защищено, и примечания к заказу содержатся в отрывке, поэтому их нельзя отобразить (я мог бы переместить их в мета, но...) 2. Элементы заказа находятся в комментариях и должны быть зациклены, а затем проанализированы для получения значимого вывод, так что я мог бы также проанализировать электронное письмо напрямую.

 0
Author: Chris Pink, 2017-02-18 17:26:47