WooCommerce 管理员报告:根据日期范围获取自定义产品报告

WooCommerce Admin Reports : Get custom product report based on date range

我需要根据数据范围获取每个产品的销售报告。这意味着我将输入产品 ID(或多个 ID)以及开始日期和结束日期,该函数将 return 我在此(开始日期和结束日期)时间段内销售该产品的数量。所以我尝试使用 WC_Admin_Report and WC_Report_Sales_By_Product。我试过的代码是-

function the_dramatist_get_report(){

    include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php');
    include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-report-sales-by-product.php');

    $reports = new WC_Report_Sales_By_Product();
    $reports->start_date = strtotime('2016-11-11');
    $reports->end_date = strtotime('2016-11-22');

    $reports->product_ids = 15;

    $total_items = absint( $reports->get_order_report_data( array(
        'data' => array(
            '_qty' => array(
                'type'            => 'order_item_meta',
                'order_item_type' => 'line_item',
                'function'        => 'SUM',
                'name'            => 'order_item_count'
            )
        ),
        'where_meta' => array(
            'relation' => 'OR',
            array(
                'type'       => 'order_item_meta',
                'meta_key'   => array( '_product_id', '_variation_id' ),
                'meta_value' => $reports->product_ids,
                'operator'   => 'IN'
            )
        ),
        'query_type'   => 'get_var',
        'filter_range' => true
    ) ) );
    return $total_items;
}

但是上面的代码是 returning 0,而我已经测试过它应该是 1。所以如果你能帮我解决这个问题会更好。

If you have any other idea to get this task done, feel free to share.

WooCommerce Order in WordPress are treated as Post. So Order Date is stored in wp_posts.post_date with wp_posts.post_type = shop_order.

因此,首先获取特定日期范围内的所有订单,然后检查这些订单中的 product_id from 订单项。

代码如下:

function getproductReportbyDateRange($start_date, $end_date, $product_ids = [])
{
    $totalProduct = [];
    foreach ($product_ids as $product_id)
    {
        $totalProduct[$product_id] = 0;
    }
    unset($product_id);
    $args = array(
        'post_type' => 'shop_order', //WooCommerce Order Status.
        'post_status' => array('wc-completed'), //list of WooCommerce order status.
        'posts_per_page' => -1,
        'date_query' => array(
            array(
                'after' => $start_date,
                'before' => $end_date,
                'inclusive' => true,
            ),
        ),
    );
    $query = new WP_Query($args);
    //print_r($query->posts);
    //die;
    if (isset($query->posts))
    {
        foreach ($query->posts as $post)
        {
            $order = new WC_Order($post->ID);
            $items = $order->get_items();
            foreach ($items as $item)
            {
                //$product_name = $item['name'];
                $product_id = $item['product_id'];
                //$product_variation_id = $item['variation_id'];
                if (in_array($product_id, $product_ids))
                {
                    $totalProduct[$product_id] = $totalProduct[$product_id] + $item['qty'];
                }
            }
        }
    }
    return $totalProduct;
}

此代码位于您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

用法

To get the product count for a single product

getproductReportbyDateRange('2016-11-11','2016-11-22',[37]);

To get the product count for a multiple product

getproductReportbyDateRange('2016-11-11','2016-11-22',[37, 53]);

代码已经过测试,功能齐全。


参考:

在尝试了很多次之后,我没有让 class 实例正常工作。所以我遵循了最古老的 CRUD 技术来解决这个问题(实际上这个 class 也在做),我写了我自己的 SQL 查询。这个WC_Admin_Reportclass也是这样做的。它有点像 WooCommerce 的查询生成器。顺便说一句,下面的 SQL 代码解决了我的问题-

SELECT order_item_meta__product_id.meta_value AS product_id,
       Sum(order_item_meta__qty.meta_value)   AS order_item_count 
FROM   wp_posts AS posts 
       INNER JOIN wp_woocommerce_order_items AS order_items 
               ON posts.id = order_items.order_id 
       INNER JOIN wp_woocommerce_order_itemmeta AS order_item_meta__qty 
               ON ( order_items.order_item_id = 
                    order_item_meta__qty.order_item_id ) 
                  AND ( order_item_meta__qty.meta_key = '_qty' ) 
        INNER JOIN wp_woocommerce_order_itemmeta AS order_item_meta__product_id 
               ON ( order_items.order_item_id = order_item_meta__product_id.order_item_id ) 
                  AND ( order_item_meta__product_id.meta_key = '_product_id' ) 
       INNER JOIN wp_woocommerce_order_itemmeta AS 
                  order_item_meta__product_id_array 
               ON order_items.order_item_id = order_item_meta__product_id_array.order_item_id 
WHERE  posts.post_type IN ( 'shop_order', 'shop_order_refund' ) 
       AND posts.post_status IN ( 'wc-completed', 'wc-processing', 'wc-on-hold' ) 
       AND posts.post_date >= '2016-11-15' 
       AND posts.post_date < '2016-11-24' 
       AND (( order_item_meta__product_id_array.meta_key IN ( '_product_id', '_variation_id' ) 
       AND order_item_meta__product_id_array.meta_value IN ( '15' ) ))
GROUP  BY product_id 

希望对你也有帮助。