【问题标题】:Woocommerce total sales value from specific couponWoocommerce 特定优惠券的总销售额
【发布时间】:2017-05-02 07:41:36
【问题描述】:

问题:

我需要一种方法来首先获得使用特定优惠券代码进行的所有销售。然后从所有这些销售中获得总收入(最好减去这些销售的任何回报。以获得实际收入值)。

执行思路

我为此使用了 woocommerce 2.6.8 和 MySql 数据库。我的猜测是,我必须以某种方式首先计算使用 PHP 和 MySql 的特定优惠券的销售额。然后,对于每个带有特定优惠券的唯一订单 ID,重新查询总和。

非常感谢您对 PHP 和查询的外观提出任何建议 :)

我应该指出,我不希望从优惠券中获得折扣总额。我需要计算使用特定优惠券(不是折扣)已售出的总价值。

好的,所以到目前为止仍然没有可行的解决方案。但这就是我认为它的基本结构。获得总数并不容易,因为优惠券与订单没有直接关联。 我相信查询必须是这样的:

{TBLPRFX}_woocommerce_order_items

第 1 步。获取 order_id FOR order_item_name={COUPON_NAME}

步骤 2. GET order_item_id FOR order_item_type=line_item WHERE order_id EQUAL {RESULT FROM STEP 1}

| order_item_id | order_item_name | order_item_type | order_id |

| 40971 | {COUPON_NAME} |优惠券 | 001

| 40970 |增值税 |税务 | 001

| 40969 | {PRODUCT_NAME} | line_item | 001

--

{TBLPRFX}_woocommerce_order_itemmeta

第 3 步。从 meta_key=_line_tax AND meta_key=_line_total 求和 meta_value,其中 order_item_id={RESULT FROM STEP 2}

| order_item_id |元密钥 |元值 |

| 40969 | _line_tax | {VALUE_TAX}

| 40969 | _line_total | {VALUE_TOTAL}

| 40969 | _product_id | {PRODUCT_ID}

--

这是我需要帮助弄清楚的查询 :) 不太确定如何在 MySql 和 PHP 中提出这个要求。我们的想法是将此作为“order_item_name = {COUPON_NAME_VARIABLE}”的foreach,这样我就可以总结使用该优惠券的所有销售总额(即不是优惠券折扣值)。

【问题讨论】:

  • 这是一次性查询还是您尝试将其作为报告添加到页面中?对 woocommerce 表有一定了解的人可能会告诉您一个简单的 SQL 查询来获得结果。这是我的 google 搜索,开始研究 google.com/… 但您的 SQL 查询可能类似于 SELECT SUM(orderValue) FROM orders WHERE order.coupon='somecoupon' --- 所以您不必进行任何计数或循环,您可以让 SQL 处理繁重的工作。
  • 将其添加为报告页面可能是未来的项目。现在,我只需在 PHP 页面上获取总和就可以了 :) 我会看看你的 GSearch 看看我是否能弄清楚……'在那之前,请继续提出你的建议;)是的,您建议的查询是我的想法,我只是不知道如何执行它(以及在哪里可以找到所有要查找的列。Woocommerce 在其 SQL 结构中一直不是很“直截了当” )
  • 是的,抱歉,我不使用 wordpress 或 woocommerce,但我处理数据库并且通常使用“管理”工具让我查看 SQL 表(如 excel),然后从那里构建 SQL 查询--- 我不知道 wordpress 是否有类似的东西。有时,这些工具还能够为所有表格创建一个漂亮的“网络”,这样您就可以看到它们是如何相互关联的。
  • 所以...尝试 phpmyadmin 查看 wordpress 的 SQL 数据库和这里的 woocommerces 数据库描述github.com/woocommerce/woocommerce/wiki/Database-Description

标签: php mysql woocommerce


【解决方案1】:

所以经过大量测试后,我想出了一个可行的解决方案。它不是最时尚的,但可以完成工作。

如果任何 SQL 忍者看到这一点,如果您能建议任何更简化的查询,那就太好了 :)

在完成第一个可行的解决方案后,我意识到需要检查更多步骤以获得更准确的总数。处理退款、税收、折扣等,并确保我只从已完成的订单中获取数据(因为取消、暂停、待处理等在完成之前不是销售)。

所以,这就是我最终的结果。就像我说的,我知道它需要一些工作,并且可能会做得更好。但就目前而言,它有效。

  • FUNCTIONS.PHP 的修订代码 -

    // COUPON CHECK
    function couponcheck() {
    global $wpdb;
    
    $gtl                = 0; // Grand Total
    $total_sales        = 0;
    $cpn                = $_GET['cpn']; // Get coupon name from URL string
    $tblprfx            = '[YOUR_TABLE_PREFIX]'; // Table prefix
    $wpps               = 'posts'; // Look for post_status
    $wppm               = 'postmeta';
    $wcoi               = 'woocommerce_order_items';
    $conversion_value   = 1;
    $base_currency      = '[YOUR_BASE_CURRENCY]';
    $currency;
    $orders_made;
    
    // Check to make sure there is a couon name in string
    if(isset($cpn) && !empty($cpn)){
        // Query chain
        $init_result = $wpdb->get_results("SELECT order_id FROM {$tblprfx}{$wcoi} WHERE order_item_name='$cpn'");
        $orders_made = count($init_result);
        foreach($init_result as $ir){
            $r1 = $ir->order_id;
            $completed_result = $wpdb->get_results( "SELECT ID FROM {$tblprfx}{$wpps} WHERE post_status='wc-completed' AND ID=$r1" );
            foreach($completed_result as $post_rows) {
                $pr = $post_rows->ID;
                $completed_sales += 1;
                $currency_result = $wpdb->get_results( "SELECT meta_value FROM {$tblprfx}{$wppm} WHERE post_id=$pr AND meta_key='_order_currency'" );
                foreach($currency_result as $cr) {
                    $currency = $cr->meta_value;
                    if($currency === 'EUR'){
                        $currency = 'EUR';
                        $currency_rate = $wpdb->get_results( "SELECT meta_value FROM {$tblprfx}{$wppm} WHERE post_id=$pr AND meta_key='_woocs_order_rate'" );                           foreach($currency_rate as $rv) {
                            $rate_value = $rv->meta_value;
                            $conversion_value = $rate_value;
                        }
                    }
                }
                $data_result = $wpdb->get_results( "SELECT meta_value FROM {$tblprfx}{$wppm} WHERE post_id=$pr AND meta_key='_order_total'" );
                foreach($data_result as $dr) {
                    $d = $dr->meta_value;
                    if($currency === 'EUR'){
                        $eur += $d;
                        $d = $d/$conversion_value;
                    }else{
                        $[YOUR_BASE_CURRENCY] += $d;
                    }
                    $gtl += $d;
                }
            }
        }
        // Total number of sales
        $refunded_orders = $orders_made-$completed_sales;
        $order_avg = $gtl/$completed_sales;
        echo '<p>Total <strong>completed, non-refunded, sales made (after discounts)</strong> with coupon <strong>' . strtoupper($cpn) . '</strong>: <br />(Number of refunded orders: <strong>' . $refunded_orders . ')</strong></p><h2>' . $completed_sales . '</h2><p>At a total <strong>sales value</strong> of:</p><h2>' . number_format($[YOUR_BASE_CURRENCY],2) . ' [YOUR_BASE_CURRENCY]</h2><h2>&euro;' . number_format($eur,2) . '</h2><p>Adding up to a <strong>sum total</strong> of:</p><h2>' . number_format($gtl,2) . ' [YOUR_BASE_CURRENCY]</h2><p>Creating an average order value of:<br /><strong>' . number_format($order_avg,2) . ' [YOUR_BASE_CURRENCY]</strong>';
    
    }
    
    } add_shortcode('coupons', 'couponcheck');
    

需要注意的是,我将实际基础货币更改为 [YOUR_BASE_CURRENCY]。欢迎评论(建设性的):)

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2021-11-06
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多