wc_update_order_item无法正确保存

时间:2018-11-21 01:45:25

标签: php wordpress woocommerce product orders

我正在尝试更新wp_woocommerce_order_items表中的商品名称,并找到功能wc_update_order_item来解决问题。

我希望它更改为随机选择的产品。它们的主要作用是我已经知道我要更改的order_item_id

这是我的代码:

    $order_item_id = array(1,2,3);
    $num = 3;
    $ctr = 0;

    $products = new WP_Query( array(
       'post_type'      => 'product',
       'post_status'    => 'publish',
       'posts_per_page' => $num,
       'orderby'        => 'rand',
    ));

    if ( $products->have_posts() ): while ( $products->have_posts() ): $products->the_post();

        wc_update_order_item($order_item_id[$ctr], array('order_item_name' => $products->post->post_title));

        $ctr++;

    endwhile; wp_reset_postdata(); endif;

应该{​​{1}}来更新订单商品名称。它会更新order_item_name,但不会更新当前的$ products-> post-> post_title值。它会以随机的产品标题进行更新。

我如何知道要保存的标题与循环中当前的post_title不同?如果我在循环中wc_update_order_item(),它会按原样显示当前产品名称,但是更新后的echo $products->post->post_title具有不同的值。

1 个答案:

答案 0 :(得分:1)

尝试以下操作将获得与订单商品相对应的相关产品ID,将它们从WP_Query中排除,避免使用相同的产品名称:

$order_item_ids = array(1,2,3);
$num = 3;
$ctr = 0;

$exluded_ids = array();

// Loop through the Order items Ids
foreach ( $order_item_ids as $item_id ) {
    // Get the order ID from the order Item ID
    $order_id = wc_get_order_id_by_order_item_id( $item_id );

    // Get the WC_Order object instance
    $order = wc_get_order( $order_id );

    // Get the WC_Order_Item_Product object instance
    $item = $order->get_item( $item_id );

    // Products IDs to be excluded from the WP_Query (array)
    $exluded_ids[] = $item->get_product_id();
}

$products = new WP_Query( array(
   'post_type'      => 'product',
   'post_status'    => 'publish',
   'posts_per_page' => $num,
   'orderby'        => 'rand',
   'post__not_in'   => $exluded_ids,
));

if ( $products->have_posts() ): 
    while ( $products->have_posts() ): $products->the_post();
        wc_update_order_item($order_item_id[$ctr], array('order_item_name' => $products->post->post_title));
        $ctr++;

    endwhile; 
    wp_reset_postdata(); 
endif;

应该可以。


现在,由于我们不知道如何获得$order_item_id数组,因此无法知道真正发生了什么。最好从一开始就说明您要做什么。