WooCommerce Получить количество позиций заказа для нескольких заказов / массовый запрос - PullRequest
1 голос
/ 14 октября 2019

Я нашел этот код на другой странице.

function jdr_get_orders_ids_from_product_id( $product_id, $orders_statuses = [ 'wc-completed' ] ) {
    global $wpdb;

    // Define HERE the orders status to include in  <==  <==  <==  <==  <==  <==  <==
    $orders_statuses = "'" . implode( "', '", $orders_statuses ) . "'";

    # Get All defined statuses Orders IDs for a defined product ID (or variation ID)
    return $wpdb->get_col( "
        SELECT DISTINCT woi.order_id
        FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim,
             {$wpdb->prefix}woocommerce_order_items as woi,
             {$wpdb->prefix}posts as p
        WHERE  woi.order_item_id = woim.order_item_id
        AND woi.order_id = p.ID
        AND p.post_status IN ( $orders_statuses )
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        AND woim.meta_value LIKE '$product_id'
        ORDER BY woi.order_item_id DESC"
    );
}

Используя это, я могу найти $ order_ids для любого заказа, который содержит конкретный $ product_id.

Однако я хочу перейтиеще на один шаг и получаем количество для каждого из этих конкретных продуктов в заказе.

Мы можем сделать это с помощью пары пользовательских функций, например, так:

function jdr_qty_sold_by_product_id( $product_id ) {
  $qty = 0;
  foreach( jdr_get_orders_ids_from_product_id( $product_id ) as $order_id )
    $qty = $qty + jdr_get_order_item_qty( $order_id, $product_id );
  return $qty;
}

function jdr_get_order_item_qty( $order_id, $product_id ) {
    $_order = wc_get_order( $order_id );
    foreach ($_order->get_items() as $item_id => $item_data) {
      $product = $item_data->get_product();
      if ( $product->get_id() == $product_id )
        return $item_data->get_quantity();
    }
    return 0;
}

Но это требует циклического прохождения каждогопорядок и каждый элемент, который занимает много времени для загрузки на страницах, где требуется эта функция (более 100 заказов).

Интересно, есть ли решение SQL, аналогичное первой функции?

Любая помощь приветствуется.

1 Ответ

1 голос
/ 14 октября 2019

В итоге это было решением:

function jdr_qty_sold_by_product_id( $product_id ) {
  global $wpdb;

  $data = jdr_get_orders_ids_and_item_ids_from_product_id( $product_id );

  $order_item_ids = array_map(function ($obj) { return $obj->order_item_id; }, $data);

  $order_item_ids = "'" . implode( "', '", $order_item_ids ) . "'";

  return $wpdb->get_var( "
      SELECT sum(meta_value)
      FROM {$wpdb->prefix}woocommerce_order_itemmeta
      WHERE order_item_id IN ( $order_item_ids )
      AND meta_key = '_qty'"
  );
}

После того, как я отредактировал другую функцию, добавив item_ids:

function jdr_get_orders_ids_and_item_ids_from_product_id( $product_id, $orders_statuses = [ 'wc-completed' ] ) {
    global $wpdb;

    $orders_statuses = "'" . implode( "', '", $orders_statuses ) . "'";

    return $wpdb->get_results( "
        SELECT DISTINCT woi.order_id, woi.order_item_id
        FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim,
             {$wpdb->prefix}woocommerce_order_items as woi,
             {$wpdb->prefix}posts as p
        WHERE  woi.order_item_id = woim.order_item_id
        AND woi.order_id = p.ID
        AND p.post_status IN ( $orders_statuses )
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        AND woim.meta_value LIKE '$product_id'
        ORDER BY woi.order_item_id DESC"
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...