我试图通过Woocommerce API获取最畅销产品列表,我正在使用WooCommerce API的第1版。我尝试了以下endpont,但它不起作用:
我的要求:
的https:// DOMAINNAME 的.com / WP-JSON / WC / V1 /产品CONSUMER_KEY = CONSUMER_KEY &安培; CONSUMER_SECRET = CONSUMER_SECRET &安培;类别= CATEGORY_ID &安培;为了= ASC&安培;的OrderBy = TOTAL_SALES
但是回复:
{
"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不是date,id,include,title,slug。之一
所以,我可以按日期,ID,包含,标题和slug排序。我如何通过total_sales
订购。有可能吗?或者你能以其他方式提出建议吗?
答案 0 :(得分:1)
您需要在主题(或插件文件)中通过functions.php
添加REST API过滤器,以确保允许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
添加端点)使得保存为元数据的潜在敏感信息不会被公开读取。
然后,尝试使用您的网址:
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
答案 1 :(得分:0)
我知道这个问题很旧,但是我写这个函数是因为我有与此问题相同的问题。
产品的total_sales元数据永远都不正确。不要使用它。
此功能仅针对正在处理和已完成的订单按产品ID汇总销售总额,因此不会计算任何取消,退款,待处理等情况。
它基于以下答案:Woocommerce: Get all orders for a product
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;
}
答案 2 :(得分:0)
根据 WC v3 API。您现在可以通过 API 拉取最受欢迎的产品(根据我的理解,这是最畅销的产品列表);
GET /wp-json/wc/v3/products?orderby=popularity&order=desc
这应该会让您按销量降序排列最受欢迎的产品。 This is not currently documented(截至 2021 年 2 月 2 日)。
可能的 orderby 参数的总列表为:date
、id
、include
、title
、slug
、modified
、{{1 }}、menu_order
、price
、popularity
答案 3 :(得分:-1)
我认为最好的方法是不要编辑您的function.php ,这不是很干净。
通常,正确使用API数据的最佳方法是从API调用大数据,然后从前端应用程序整理数据。这就是我直接在移动应用上按total_sales
排序的所有WooCommerce产品的目的。
我在JS中按数组排序使用了它,并获得了前10大畅销产品:
const productsTopSales = products.sort((a, b) => a.total_sales < b.total_sales).slice(0,10)
我认为在PHP中是这样的:
$products_sorted = usort($products, function($a, $b){
return $a["total_sales"] < $b["total_sales"];
};
$products_top_sales = array_slice($products_sorted, 0, 10);
告诉我是否对您有好处!
干杯?