WooCommerce REST API - 在没有太多请求的情况下获取具有变体的所有产品

时间:2018-03-18 20:47:04

标签: php api woocommerce-rest-api

我使用WooCommerce REST API来例如得到所有具有变化的产品,但是我遇到了一个关于已解雇请求数量的相当大的问题。我需要帮助优化下面的情况。

情况: 一个网上商店,每种产品有50种产品和5种不同的产品。

  1. 获取所有主产品(~1个请求)
  2. 获取每种产品的所有变体(50个请求)
  3. 请求总数= 51

    如果不触发51个请求,我怎么能这样做?是否有可能以某种方式急切加载所有变化的产品?

3 个答案:

答案 0 :(得分:2)

不幸的是,如果没有访问服务器,他们的“新” API便无法做到这一点。因此,为运行WooCommerce的客户开发工具的第三方公司陷入了困境。

每个变体都必须发出请求的问题并不是唯一的问题。计数产品也是不可能的。现在,我们必须加载所有产品的数据以对其进行计数...

如果客户的商店中有10,000种产品,每种产品有3种版本,我们必须提出3万多个个人请求...(而不是几十个,每页一个)。

就个人而言,这是完全不切实际的,并且很可能使我们被某些防火墙列入黑名单,因此我决定使用旧的API:https://woocommerce.github.io/woocommerce-rest-api-docs/v3.html#view-products-count

代替“新的”:https://woocommerce.github.io/woocommerce-rest-api-docs/

何时将旧的API从WooCommerce中完全删除?我不知道,但是还是没有其他现实的选择。

答案 1 :(得分:1)

是的,您可以通过自定义WooCommerce产品REST API响应来实现。

我附上了一些可以帮助你的代码。

add_filter( 'woocommerce_rest_prepare_product_object', 'custom_change_product_response', 20, 3 );
add_filter( 'woocommerce_rest_prepare_product_variation_object', 'custom_change_product_response', 20, 3 );

function custom_change_product_response( $response, $object, $request ) {
 $variations    = $response->data['variations'];
 $variations_res   = array();
        $variations_array = array();
        $var              = array();
        if ( ! empty( $variations ) && is_array( $variations ) ) {
            foreach ( $variations as $variation ) {
                $variation_id                    = $variation;
                $variation                       = new WC_Product_Variation( $variation_id );
                $variation_attributes            = $variation->get_variation_attributes();
                $variations_res['variation_id']  = $variation_id;
                $variations_res['on_sale']       = $variation->is_on_sale();
                $variations_res['regular_price'] = (float) $variation->regular_price;
                $variations_res['sale_price']    = (float) $variation->sale_price;
                $variations_res['currency']      = get_woocommerce_currency_symbol();
                $variations_res['sku']           = $variation->get_sku();
                $variations_res['description']   = $variation->get_description();
                $variations_res['quantity']      = $variation->get_stock_quantity();
                if ( $variations_res['quantity'] == null ) {
                    $variations_res['quantity'] = '';
                }
                $variations_res['in_stock']        = $variation->is_in_stock();
                $featured_image                    = wp_get_attachment_image_src( get_post_thumbnail_id( $variation_id ), 'shop_catalog' );
                $variations_res['variation_image'] = $featured_image[0];
                if ( $variations_res['variation_image'] == null ) {
                    $variations_res['variation_image'] = " ";
                }
                foreach ( $variation_attributes as $key => $value ) {
                    if ( $key == 'attribute_pa_color' ) {
                        $variation_attributes[ $key ] = get_color_code_by_name( $value );
                    }
                }
                $variations_res['variation_attributes'] = $variation_attributes;
                $variations_array[]                     = $variations_res;
            }
        }
        $response['product_variations'] = $variations_array;
}
return $response;
}

我这样做了。我已经获得了单个参数product_variations的所有变体。

答案 2 :(得分:0)

您可以在1个请求中全部获得产品变体

GET /products/<product-id>/variations/

然后遍历结果以找到匹配的结果并检索ID