草庐IT

php - 特定优惠券的 Woocommerce 总销售额

coder 2023-10-03 原文

问题:

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

执行的想法

我为此使用了 woocommerce 2.6.8 和 MySql 数据库。我的猜测是,我将不得不首先计算使用 PHP 和 MySql 使用特定优惠券进行的销售数量。然后,对于每个带有特定优惠券的唯一订单 ID,对总计进行新查询。

非常感谢任何关于 PHP 和查询的建议 :)

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

好的,到目前为止还没有有效的解决方案。但我认为这是它的基本结构。获得总数并不是那么容易,因为优惠券与订单没有直接关联。 我相信查询必须符合以下内容:

{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 |订单项目类型 |订单编号 |

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

| 40970 |增值税 |税 | 001

| 40969 | {PRODUCT_NAME} |订单项 | 001

--

{TBLPRFX}_woocommerce_order_itemmeta

第 3 步。将 meta_value FROM meta_key=_line_tax AND meta_key=_line_total WHERE 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 中请求这个。我的想法是使它成为一个 foreach,其中“order_item_name={COUPON_NAME_VARIABLE}”,这样我就可以总结使用该优惠券的所有销售总额(即不是优惠券折扣值)。

最佳答案

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

如果任何 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]。欢迎评论(建设性的):)

关于php - 特定优惠券的 Woocommerce 总销售额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41185586/

有关php - 特定优惠券的 Woocommerce 总销售额的更多相关文章

  1. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  2. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  3. ruby-on-rails - Ruby on Rails - 需要在每周的特定时间将消息发送到电子邮件 - 2

    我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用ruby​​onrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_

  4. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  5. ruby - 根据要求使用特定的 VCR 磁带 - 2

    情况:使用Rspec、FactoryGirl和VCR测试Rails应用程序。每次创建用户时,都会通过Stripe的API创建关联的Stripe客户。测试时,添加VCR.use_cassette或describe"...",vcr:{cassette_name:'stripe-customer'}do...到涉及用户创建的每个规范。我的实际解决方案如下:RSpec.configuredo|config|config.arounddo|example|VCR.use_cassette('stripe-customer')do|cassette|example.runendendend但这是

  6. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

  7. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  8. ruby-on-rails - 更改包含特定字符串的所有数组元素 - 2

    array=["Spamisbad","Hamisgood"]我想从数组中选择包含单词“good”的元素,并将字符串设置为新变量。我怎么能这样做? 最佳答案 由于目前为止这两个答案都没有指导您如何将数组中的字符串更新为新值,因此这里有一些选项:#Findeverystringmatchingacriteriaandchangethemarray.select{|s|s.include?"good"}.each{|s|s.replace("bad")}#Findeverystringmatchingapatternandchanget

  9. ruby - 如果哈希中只有一个特定键具有真值(所有其他值均为假),如何返回真 - 2

    例如:options={fight:true,use_item:false,run_away:false,save_game:false}我想要一个计算结果为true的bool表达式,当且仅当:fight为true,其余为false(如上图所示)。我可以一起解决这个问题,但我正在努力训练自己编写更优雅的ruby​​。谢谢!编辑:黑客是:(options[:fight]==true&&options.delete(:fight).values.all{|x|!x}) 最佳答案 假设所有值都是严格的bool值,它很简单:options=

  10. ruby - 强制使用特定的 gem 版本作为默认版本? - 2

    假设我安装了三个gem:package-0.4.0、package-0.5.0和package-0.5.0-jbfink(我构建了-jbfink一个,因为我对0.5做了非常小的改动.0的来源,并希望将其与官方版本区分开来)。是否有gem(或其他命令)将其设为默认值?现在我已经安装了所有三个,但我的shell正在从package-0.5.0中获取可执行文件,我宁愿它默认为0.5.0-jbfink。将0.5.0-jbfink命名为0.5.1解决了这个问题,但我不想这样做,因为我不想与正式发布的0.5.1出现冲突。 最佳答案 转到conf

随机推荐