【问题标题】:Woocommerce echo total retail sales per productWoocommerce 呼应每种产品的总零售额
【发布时间】:2014-11-18 02:47:41
【问题描述】:

我一直在四处寻找,似乎找不到任何东西。现在我有一个查询要显示我商店中的产品。我还需要能够在查询中显示每种产品的总销售额和每种产品的总零售额。我用它来创建排行榜。

总销售额很简单,这只是 woocommerce 为您设置的自定义字段。我很难找到零售总额的答案。

我还需要显示整个商店的总零售额,但似乎也没有什么办法。

this page 上的代码可以正常工作,但随后插件更新并停止运行。它只是显示 0,现在什么也没有显示。

这是我现在的查询,使用上述页面中的代码。

    <?php $my_query = new WP_Query( array( 'post_type' => 'product', 'posts_per_page' => -1 ) );?>
     <?php if ( $my_query->have_posts() ) : ?> 
     <?php $order_items = apply_filters( 'woocommerce_reports_top_earners_order_items', $wpdb->get_results( "
        SELECT order_item_meta_2.meta_value as product_id, SUM( order_item_meta.meta_value ) as line_total FROM {$wpdb->prefix}woocommerce_order_items as order_items

        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta_2 ON order_items.order_item_id = order_item_meta_2.order_item_id
        LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID
        LEFT JOIN {$wpdb->term_relationships} AS rel ON posts.ID = rel.object_ID
        LEFT JOIN {$wpdb->term_taxonomy} AS tax USING( term_taxonomy_id )
        LEFT JOIN {$wpdb->terms} AS term USING( term_id )

        WHERE   posts.post_type     = 'shop_order'
        AND     posts.post_status   = 'publish'
        AND     tax.taxonomy        = 'shop_order_status'
        AND     term.slug           IN ('" . implode( "','", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "')
        AND     order_items.order_item_type = 'line_item'
        AND     order_item_meta.meta_key = '_line_total'
        AND     order_item_meta_2.meta_key = '_product_id'
        GROUP BY order_item_meta_2.meta_value
    " )); ?>
     <?php while($my_query->have_posts()): $my_query->the_post(); ?>



    <div id="<?php $totalDonations = 0;
 $Charities = array($post->ID);
//Gather Total for Individual Items
foreach ($order_items as $item) {

    if (in_array($item->product_id, $Charities)) {

        $totalDonations = $item->line_total + $totalDonations;


    }

} echo $totalDonations; ?>" class="sort_by_total">
                        <div class="one_half">
                            <li><span><?php the_title(); ?></span></li>
                        </div>
                        <div class="one_quarter">
                            <p><?php echo get_post_meta($post->ID, 'total_sales', true); ?></p>
                        </div>
                        <div class="one_quarter last">
                            <p>$<?php echo $totalDonations; ?></p>
                        </div>
                        <div class="clear"></div>
                    <div class="divider"></div> 
                        </div>
                    <?php endwhile; ?>

                    <?php else : ?>

                    <?php endif; ?>
                    <?php wp_reset_query();?>

一旦它们显示出来,我将使用总零售额作为每个 div 的 id,并以此为基础使用 jquery 对排行榜进行排序。这就是为什么它在代码中被调用了两次。

感谢任何帮助。谢谢

编辑:我一直在检查错误消息,我得到:PHP Fatal error: Using $this when not in object context on line 33 第 66 行也有同样的错误。第 33 行是以 &lt;?php $order_items = apply_filters( 开头的行,第 66 行是以 @ 开头的行987654325@

编辑编辑:现在我没有收到任何错误消息。

【问题讨论】:

  • 总销售额和“零售”总销售额有什么区别?
  • 总销售额是销售的特定产品的数量。零售总额是明智的销售总额。因此,如果有两个特定产品以每件 10.00 的价格出售,那么它应该提供 20。

标签: php mysql wordpress woocommerce


【解决方案1】:

WooCommerce 2.2 仪表板小部件使用以下代码计算过去一个月的零售额:

    // Sales
    $query            = array();
    $query['fields']  = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
    $query['join']    = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
    $query['where']   = "WHERE posts.post_type IN ( '" . implode( "','", wc_get_order_types( 'reports' ) ) . "' ) ";
    $query['where']  .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
    $query['where']  .= "AND postmeta.meta_key   = '_order_total' ";
    $query['where']  .= "AND posts.post_date >= '" . date( 'Y-m-01', current_time( 'timestamp' ) ) . "' ";
    $query['where']  .= "AND posts.post_date <= '" . date( 'Y-m-d H:i:s', current_time( 'timestamp' ) ) . "' ";

    $sales = $wpdb->get_var( implode( ' ', apply_filters( 'woocommerce_dashboard_status_widget_sales_query', $query ) ) );

然后用 :

显示它
wc_price( $sales );

因为日期被限制在 $query['where'] 字符串的最后两行,我想如果你想获得所有时间的总销售额,可以删除这些。

    // All-time Sales for entire store
    $query            = array();
    $query['fields']  = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
    $query['join']    = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
    $query['where']   = "WHERE posts.post_type IN ( '" . implode( "','", wc_get_order_types( 'reports' ) ) . "' ) ";
    $query['where']  .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
    $query['where']  .= "AND postmeta.meta_key   = '_order_total' ";

    $sales = $wpdb->get_var( implode( ' ', $query ) );

这让我觉得这是一个相当密集的查询,所以如果要一直运行它,您可能需要调查瞬态。

我不太确定是否要为单个产品修改它,因为我的 SQL 很弱,但这里尝试获取“where”字符串来指定产品的 ID。

    // All-time Sales for specific product, maybe
    $product_id = 10;
    $query            = array();
    $query['fields']  = "SELECT SUM( postmeta.meta_value ) FROM {$wpdb->posts} as posts";
    $query['join']    = "INNER JOIN {$wpdb->postmeta} AS postmeta ON posts.ID = postmeta.post_id ";
    $query['where']   = sprintf( "WHERE posts.ID = %n", $product_id );
    $query['where']  .= "AND posts.post_status IN ( 'wc-" . implode( "','wc-", apply_filters( 'woocommerce_reports_order_statuses', array( 'completed', 'processing', 'on-hold' ) ) ) . "' ) ";
    $query['where']  .= "AND postmeta.meta_key   = '_order_total' ";

    $sales = $wpdb->get_var( implode( ' ', $query ) );

【讨论】:

  • 你太棒了。有史以来的总零售额就像一个魅力。但是单个产品 ID 似乎不起作用,它只是输出 0。另一个问题。有没有办法让它不显示在 标签中?在尝试将其用作 ID 时,这被证明是一个问题。非常感谢您迄今为止的帮助。
  • 那部分是在黑暗中拍摄的。将数字包装在 span 中的是 wc_price(),尽管它也将其格式化为货币。
  • 我越想越不认为你可以通过查询获得单个产品的总销售额。我认为您可能必须编写某种特殊函数,以便在订单完成时更新和存储每个项目的总数。也许作为项目本身的发布元?这不是不可能,但也不容易。
  • 好的,感谢您取消格式化。这正在迅速超出我的知识范围。因此,如果您对它的外观有任何建议。我很乐意尝试。这会像现在的“total_sales”那样工作吗?
  • 仅在我上面描述的最模糊的意义上......就像在订单完成时更新后元键一样。我想当订单被退款时你会做同样的事情吗?然后到最后,您只需要get_post_meta() 即可获得特定产品。这很有趣,但对于这个问题,我现在无法回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 2019-03-19
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多