我试图通过Woocommerce获得顶级销售产品的列表,我使用的是WooCommerce API的版本1。我尝试了下面的endpont,但是它不起作用:
我的请求:
但它的响应:
{
"code": "rest_invalid_param",
"message": "Invalid parameter(s): orderby",
"data": {
"status": 400,
"params": {
"orderby": "orderby is not one of date, id, include, title, slug."
}
}
}
orderby不是一个日期,id,包含,标题,段塞。所以,我可以按日期,ID,包括,标题和段塞订购。我怎样才能用total_sales
点菜。做得到吗?或者你能提出其他的建议吗?
发布于 2018-03-23 22:44:51
您需要在主题(或插件文件)中通过functions.php
添加REST过滤器,以确保允许使用meta_key
和meta_value
。
add_filter('rest_endpoints', function ($routes) {
// I'm modifying multiple types here, you won't need the loop if you're just doing WooCommerce products
foreach (['product', 'another_type'] as $type) {
if (!($route =& $routes['/wp/v2/' . $type])) {
continue;
}
// Allow ordering by my meta value
$route[0]['args']['orderby']['enum'][] = 'meta_value_num';
// Allow only the meta keys that I want
$route[0]['args']['meta_key'] = array(
'description' => 'The meta key to query.',
'type' => 'string',
'enum' => ['my_meta_key', 'another_key'],
'validate_callback' => 'rest_validate_request_arg',
);
}
return $routes;
});
您可以在枚举值中添加任何您想要添加的元键。这样做(而不是添加过滤器来为所有meta_key
添加端点)可以防止保存为元数据的敏感信息公开可读性。
然后,为您的URL尝试以下内容:
https://DOMAINNAME.com/wp-json/wc/v1/products?consumer_key=CONSUMER_KEY&consumer_secret=CONSUMER_SECRET&category=CATEGORY_ID&order=asc&filter[meta_key]=total_sales&orderby=meta_value_num
发布于 2021-02-01 11:13:40
对于那些还不知道这个问题的人来说
如所示。您现在可以通过API (根据我的理解,这是最畅销的产品列表)获取最受欢迎的产品;
GET /wp-json/wc/v3/products?orderby=popularity&order=desc
这样你就能得到最受欢迎的产品,按销售数量降序。这一点目前没有记录在案。 (截至2021年2月2日)。
可能的排序参数的总列表是:date
、id
、include
、title
、slug
、modified
、menu_order
、price
、popularity
、rating
发布于 2019-12-30 16:39:42
我知道这个问题很老,但是我写这个函数是因为我和这个问题有相同的问题。
产品的total_sales元数据从来都不正确。别用它。
该函数只对处理和已完成的订单按产品ID计算销售总额,因此不计算任何已取消、退款、待决的订单。
它是基于这样的答案:获得产品的所有订单
function get_total_sales_product_id( $product_id, $order_status = array( 'wc-completed', 'wc-processing' ) ){
global $wpdb;
$order_ids = $wpdb->get_col("
SELECT order_items.order_id
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->posts} AS posts ON order_items.order_id = posts.ID
WHERE posts.post_type = 'shop_order'
AND posts.post_status IN ( '" . implode( "','", $order_status ) . "' )
AND order_items.order_item_type = 'line_item'
AND order_item_meta.meta_key = '_product_id'
AND order_item_meta.meta_value = '$product_id'
");
$unique_order_ids = array_unique($order_ids);
$total_sales = 0;
foreach ($unique_order_ids as $order_id) {
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item_key => $item ) {
if ($item->get_product()->get_id() == $product_id) {
$total_sales = $total_sales + $item->get_quantity();
}
}
}
return $total_sales;
}
https://stackoverflow.com/questions/49461661
复制