优化WooCommerce订单项目查询

时间:2017-06-29 作者:Josh Warren

我有一个自定义的管理页面,需要搜索所有店铺订单,看看它们是否包含特定的项目。相关代码如下:

$args = array(
 \'post_status\' => \'any\',
 \'post_type\' => \'shop_order\',
 \'posts_per_page\' => -1
);

$order_query = new WP_Query($args);

if ($order_query->have_posts()) {

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

    global $post;

    $order = wc_get_order($post->ID);
    $items = $order->get_items();

    foreach($items as $item) {
      // Check if item data matches what was searched for
      if($item[\'variation_id\'] == $product_variation_ID && $item[\'start-date\'] == $start_date && $item[\'location\'] == $location) { 
        // This order contains the item we\'re looking for     
      }

    } 

  endwhile; 
}

wp_reset_postdata(); 
基本上我收到所有的订单,打电话wc_get_order() 在每个店铺订单ID上,然后致电get_items() 在每个订单对象上。然后,我遍历这些项目,看看每个项目是否与搜索的内容匹配。每个订单只包含一个项目,尽管这不会改变任何东西。

这段代码运行得很好,只是现在站点有1000多个订单,查询在共享主机上的资源过于密集,我达到了主机的内存限制,无法完成。具体来说,它在呼叫时失败wc_get_order() 在每个shop\\u order post ID上。

有什么方法可以让这个查询更有效吗?我想不出任何其他方法可以不打电话就从shop\\u order post类型获取商品wc_get_order(), 即使每个订单只包含一个项目。我不想这样做超过1000次,但我只是看不到另一种方法。

我可能不得不暂时转移到VPS来解决这个问题,但我觉得即使有VPS的额外资源,最终我也会遇到同样的问题,因为要循环的shop\\u订单帖子的数量只会不断增加。

1 个回复
SO网友:Matthew Jason Dever

我也在做类似的事情。我一开始使用了一种类似于您的方法,但通过直接使用WC API查询而不是WP查询,使其速度略快。

我仍在寻找查询所有订单变化的方法。。。

//get number of orders per variation_id
function getOrdersfromVariation($variation_id){
  $numberOfOrders = 0;
  ip_write_log("getOrdersfromVariation varid: $variation_id");

  // rewrite with wc_get_orders
  $args = array(
    \'status\' => array(  \'processing\', \'completed\'),
      \'limit\' => -1,
   );
  $orders = wc_get_orders( $args );
  if(isset($orders)){
  //TODO: Get order count - $total_orders = $orders->total;

    foreach ($orders as $order){
       foreach ($order->get_items() as $key => $lineItem) {
           $item_data = $lineItem->get_data();

           if ($item_data[\'variation_id\'] == $variation_id) {
              $numberOfOrders++;

           }
       }
    }
    if(isset($numberOfOrders)){
       return $numberOfOrders;
    }
   }
 return;
}

结束

相关推荐