有没有办法通过WooCommerce API获得顶级销售产品?

时间:2018-03-24 05:42:05

标签: php wordpress woocommerce

我试图通过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订购。有可能吗?或者你能以其他方式提出建议吗?

4 个答案:

答案 0 :(得分:1)

您需要在主题(或插件文件)中通过functions.php添加REST API过滤器,以确保允许meta_keymeta_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 参数的总列表为:dateidincludetitleslugmodified、{{1 }}、menu_orderpricepopularity

答案 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);

告诉我是否对您有好处!

干杯?