- Windows 本地安装 Kibana 查询 Elasticsearch
- Windows 本地安装和使用 Elasticsearch
- WooCommerce 请登录 链接不工作
- 使 WooCommerce 订单搜索支持自定义字段
- 如何使用 WooCommerce Session
- 获取 WooCommerce 页面地址的方法
- WooCommerce后台通过自定义字段检索产品
- WooCommerce 自定义订单号
- WooCommerce Login / Register Redirect
- WooCommerce自带的shortcodes
- WooCommerce 打印订单
- WooCommerce 新用户注册管理员通知
- WooCommerce 移除产品页商品图片的url
- WooCommerce Email 模版增加全局内容的一个方法
- 错误:Call to a member function is_visible() on a non-object
- WooCommerce实用代码集合
- WooCommerce根据支付方式收取额外费用(2021)
- WooCommerce 订单管理
- WooCommerce移除登出账户的确认提示
- WooCommerce列出所有产品分类(2021)
- WooCommerce收据功能的实现
- WooCommerce Dynamic Pricing动态价格表(2021)
- 如何免费试用WordPress付费插件
- 写代码定制WooCommerce产品页模板(2021)
- 自定义WooCommerce Order Details模板明细部分(2021)
- WooCommerce Class WC_Order
- WooCommerce 产品搜索支持 SKU
- WooCommerce定制产品的Additional Information选项卡(2021)
- WooCommerce 定制产品页选项卡(2021)
- WooCommerce admin bar快捷菜单
- WooCommerce库存管理插件Stock Manager for WooCommerce(2021)
- WordPress备份插件UpdraftPlus(2021)
- 隐藏WooCommerce的购物功能
- WooCommerce目录模式Catalog Mode(2021)
- 构建基于WooCommerce和WPML的多语言电商网站 - 概述篇
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装WooCommerce和测试数据
- 配置WordPress运行环境 - Wampserver安装图解
- 构建基于WooCommerce和WPML的多语言电商网站 - 安装和配置 WPML 插件
- 构建基于 WooCommerce 和 WPML 的多语言电商网站 - 使 WooCommerce 和 WPML 协同工作
- WooCommerce Paypal & RMB
- WooCommerce 2.0 来袭
- 如何修改 WooCommerce 插件的模版
- WooCommerce 显示每个产品的总销量
- WooCommerce 中的 Custom JavaScript Event
- WooCommerce Authorize.net CIM Gateway
- 用WooCommerce Fees API 添加手续费
- WooCommerce 产品加入购物车后直接结账
- 设置 Paypal Sandbox 测试 WooCommerce Subscription 产品
- WooCommerce Conditional Tags 详解
- WooCommerce Single Category Selector
- WooCommerce 自定义结账字段(2021)
- WooCommerce 将产品属性加入网站菜单(2021)
- WooCommerce Product API(2021)
- WooCommerce 添加附加费 surcharge(2021)
- WooCommerce 安装中文语言包(2021)
- WooCommerce 营销:订阅促销弹窗和潜在客户发掘(2021)
- WooCommerce 邮件定制、预览和测试(2021)
- WooCommerce 在线站点付款测试(2021)
- WooCommerce Product Archive Image Slider(2021)
- woocommerce_form_field() examples
- WooCommerce 商店页插入 shortcode 问题
- WooCommerce 在 Email Header 中获取用户信息
- WooCommerce 自定义结账字段图文详解
- WooCommerce 2.1.12 - 如何修改相关产品列表
- 修改 WooCommerce My Account 页面的地址格式
- Woocommerce:如何根据国家设置支付方式
- Woocommerce 支付宝插件初探
- 支付宝集成 如何在回调地址中使用自定义参数
- Woocommerce Settings API 如何使用
- Woocommerce 中文货币符号错误如何解决
- WooCommerce 如何扩展支付方式
- Woo commerce 搭建 WordPress 电子商务网站
- WooCommerce 查看所有用户购物车(2021)
- WooCommerce 最近一个月销量排行(2021)
- WooCommerce 后台自定义产品选项(2021)
- WooCommerce 自定义产品列表带分页(2021)
- WooCommerce 设置 - 自定义选项卡和字段(2021)
- WooCommerce My Account Menu Links 定制方法(2021)
- WooCommerce 产品列表增加数量字段
- WooCommerce 可变产品变种的数量限制
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
WooCommerce 最近一个月销量排行(2021)
WooCommerce的shortcode best_selling_products能显示产品销量排行,但这个排行是网站上线以来的总销量的排行,如果想显示最近一个月销量排行该怎么办呢?
WooCommerce如何记录销量
WooCommerce的销量记录在wp_postmeta表中,如下图所示,每次卖出产品就更新一下这个产品的的meta值,并没有记录销售时间。
用代码实现最近一个月销量排行
利用上次介绍的WooCommerce自定义产品列表带分页来实现,并做成一个shortcode,去掉排序的filter,因为我们固定要按照销量排序。
SQL查询的原理简单描述一下:
- 从wp_post表中找出所有post_status为wc-processing或wc-completed的订单。
- 根据订单(post_id)去
woocommerce_order_item
表里找到每个订单里的产品。 - 再去
woocommerce_order_itemmeta
表中找到每个产品的销量(_qty)。 - 在重新join 一次
wp_post
表,这次使用产品 ID去连接,目的是查询产品是否为publish状态。 - 最后就是约束条件,比如订单的时间是30天以内的等等,再按照销量排序一下,搞定。
class CP_Month_Best_Selling {
public function __construct() {
add_shortcode('month-best-selling', [$this, 'best_selling']);
add_filter('query_vars', [$this, 'add_product_pagination_query_vars']);
}
function best_selling($atts) {
$a = shortcode_atts(array(
'days' => 30,
'posts_per_page' => 12,
), $atts);
extract($a);
ob_start();
$current_page = (get_query_var('product-page')) ? absint(get_query_var('product-page')) : 1;
$data = $this->get_best_selling_products_from_cache(absint($days), absint($posts_per_page), absint($current_page));
$current_page = (int)$data['current_page'];
$total_products = (int)$data['total_products'];
$total_pages = (int)$data['total_pages'];
$products = $data['products'];
$this->the_best_sellers( $current_page, $total_products, $total_pages, $posts_per_page, $products );
return ob_get_clean();
}
function get_best_selling_products_from_cache( $days, $posts_per_page, $current_page ){
$cache_key ='best_seller-' . $days . '-' . $posts_per_page . '-' . $current_page;
$data = get_transient( $cache_key);
if( $data === false ){
$data = $this->get_best_selling_products( $days, $posts_per_page, $current_page );
set_transient( $cache_key, $data, DAY_IN_SECONDS );
}
return $data;
}
function the_best_sellers( $current_page, $total_products, $total_pages, $posts_per_page, $products ){
wc_set_loop_prop('current_page', $current_page);
wc_set_loop_prop('is_paginated', wc_string_to_bool(true));
wc_set_loop_prop('page_template', get_page_template_slug());
wc_set_loop_prop('per_page', $posts_per_page);
wc_set_loop_prop('total', $total_products);
wc_set_loop_prop('total_pages', $total_pages);
wc_set_loop_prop('is_shortcode', true);
// Loop start
if ($products) {
$original_post = $GLOBALS['post'];
echo '<div>',woocommerce_result_count(), '</div>';
woocommerce_product_loop_start();
foreach ($products as $product) {
$GLOBALS['post'] = get_post(absint($product['id']));
setup_postdata($GLOBALS['post']);
wc_get_template_part('content', 'product');
}
$GLOBALS['post'] = $original_post;
woocommerce_product_loop_end();
woocommerce_pagination();
wp_reset_postdata();
} else {
/**
* Hook: woocommerce_no_products_found.
*
* @hooked wc_no_products_found - 10
*/
do_action('woocommerce_no_products_found');
}
}
function get_best_selling_products($days = 30, $posts_per_page = 12, $paged ) {
global $wpdb;
$date = strtotime("-$days days");
$start_date = array(
'year' => date("Y", $date),
'month' => date("m", $date),
'day' => date("d", $date),
);
$start_date = implode('-', $start_date);
$limit = ($paged - 1) * $posts_per_page . "," . $posts_per_page;
// Get total rows and total pages for later use in pagination
// No need to count the sales at this phase
$total = $wpdb->get_var($wpdb->prepare("
SELECT count(DISTINCT p.ID) as count
FROM {$wpdb->prefix}posts o
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi
ON (o.ID = oi.order_id AND o.post_status IN ('wc-processing','wc-completed'))
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim
ON (oi.order_item_id = oim.order_item_id AND oim.meta_key = '_product_id')
INNER JOIN {$wpdb->prefix}posts p
ON (oim.meta_value = p.ID)
WHERE p.post_status = 'publish'
AND o.post_date >= '%s'", $start_date)
);
$total = absint($total);
$total_pages = ceil($total / $posts_per_page);
// Get paginated best selling products
$products = $wpdb->get_results($wpdb->prepare("
SELECT p.ID as id, SUM(oim2.meta_value) as count
FROM {$wpdb->prefix}posts p
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim
ON p.ID = oim.meta_value
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim2
ON oim.order_item_id = oim2.order_item_id
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi
ON oim.order_item_id = oi.order_item_id
INNER JOIN {$wpdb->prefix}posts as o
ON o.ID = oi.order_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND o.post_status IN ('wc-processing','wc-completed')
AND o.post_date >= '%s'
AND oim.meta_key = '_product_id'
AND oim2.meta_key = '_qty'
GROUP BY p.ID
ORDER BY SUM(oim2.meta_value) + 0 DESC
LIMIT $limit", $start_date), ARRAY_A);
return array(
'current_page' => $paged,
'total_products' => $total,
'total_pages' => $total_pages,
'products' => $products,
'posts_per_page' => $posts_per_page
);
}
/**
* Add product-page to query vars
*
*/
function add_product_pagination_query_vars($vars) {
$vars[] = "product-page";
return $vars;
}
}
new CP_Month_Best_Selling();
在编辑器中输入shortcode [sola_best_selling_products days=30 posts_per_page=3]
前台效果
参考文章:Get WooCommerce best selling products for the current month
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论