WooCommerce REST API:按多个属性查询产品

时间:2018-02-27 10:27:47

标签: wordpress woocommerce woocommerce-rest-api

根据API:http://woocommerce.github.io/woocommerce-rest-api-docs/#list-all-products,我们可以按单个属性过滤产品。但是通过API搜索多个属性是不可能的吗?

示例:“我想要红色衬衫”。此属性为color,属性字词为red。要完成搜索,查询字符串如下所示:products?category=17&attribute=pa_color&attribute_term=22&

我们只买红衬衫。

但是对于“我想要红色 中等衬衫”,此处会遇到值为size的其他medium属性。根据API,无法在查询字符串中关联colorsize属性。所以查询 -

products?category=17&attribute=pa_color&attribute_term=22&attribute=pa_size&attribute_term=24& 

返回商店中的所有商品

有解决方法吗?

4 个答案:

答案 0 :(得分:1)

我编写了可以完成所有操作的自定义查询:D 这是一个回调函数。您需要做的就是使用此回调创建新的端点:

以下是文档:

category - string (category slug) - filter by products category.
per_page - int (default - from admin) - show items on one page.
offset - int (default - 1) - show page number.
order - string (ASC/DESC, default: desc) - order products ascending or descending.
orderby - string (name, price, default: name) - order products by key.
filter - array
[pa_attribute_name (string) ]  = array of ID's.
[min_price (string) ] = int.
[max_price (string) ] = int.

示例:

/wp-json/go/v1/products/?category=smartphones&filter[pa_brand]=87,88&filter[pa_colour]=17&filter[min_price]=1&filter[max_price]=50&per_page=10&offset=1&order=DESC&orderby=price

这是一个功能:

public function get_products_list_callback( \WP_REST_Request $request ) {
    $params = $request->get_params();

    $category = General_Helper::get_array_value( 'category', $params );
    $filters  = General_Helper::get_array_value( 'filter', $params );
    $per_page = General_Helper::get_array_value( 'per_page', $params );
    $offset   = General_Helper::get_array_value( 'offset', $params );
    $order    = General_Helper::get_array_value( 'order', $params );
    $orderby  = General_Helper::get_array_value( 'orderby', $params );

    $output = [];

    // Use default arguments.
    $args = [
      'post_type'      => Config::POST_TYPE_SLUG_PRODUCT,
      'posts_per_page' => get_option( 'posts_per_page' ),
      'post_status'    => 'publish',
      'paged'          => 1,
    ];

    // Posts per page.
    if ( ! empty( $per_page ) ) {
      $args['posts_per_page'] = $per_page;
    }

    // Pagination, starts from 1.
    if ( ! empty( $offset ) ) {
      $args['paged'] = $offset;
    }

    // Order condition. ASC/DESC.
    if ( ! empty( $order ) ) {
      $args['order'] = $order;
    }

    // Orderby condition. Name/Price.
    if ( ! empty( $orderby ) ) {
      if ( $orderby === 'price' ) {
        $args['orderby'] = 'meta_value_num';
      } else {
        $args['orderby'] = $orderby;
      }
    }

    // If filter buy category or attributes.
    if ( ! empty( $category ) || ! empty( $filters ) ) {
      $args['tax_query']['relation'] = 'AND';

      // Category filter.
      if ( ! empty( $category ) ) {
        $args['tax_query'][] = [
          'taxonomy' => Config::TAXONOMY_SLUG_PRODUCT,
          'field'    => 'slug',
          'terms'    => [ $category ],
        ];
      }

      // Attributes filter.
      if ( ! empty( $filters ) ) {
        foreach ( $filters as $filter_key => $filter_value ) {
          if ( $filter_key === 'min_price' || $filter_key === 'max_price' ) {
            continue;
          }

          $args['tax_query'][] = [
            'taxonomy' => $filter_key,
            'field'    => 'term_id',
            'terms'    => \explode( ',', $filter_value ),
          ];
        }
      }

      // Min / Max price filter.
      if ( isset( $filters['min_price'] ) || isset( $filters['max_price'] ) ) {
        $price_request = [];

        if ( isset( $filters['min_price'] ) ) {
          $price_request['min_price'] = $filters['min_price'];
        }

        if ( isset( $filters['max_price'] ) ) {
          $price_request['max_price'] = $filters['max_price'];
        }

        $args['meta_query'][] = \wc_get_min_max_price_meta_query( $price_request );
      }
    }

    $the_query = new \WP_Query( $args );

    if ( ! $the_query->have_posts() ) {
      return $output;
    }

    while ( $the_query->have_posts() ) {
      $the_query->the_post();

      $output[] = get_the_title();
    }
    wp_reset_postdata();

    return $output;
  }

希望有帮助

答案 1 :(得分:0)

我刚看了

的woocommerce rest api实现
plugins/woocommerce/includes/api/class-wc-rest-products-controller.php

文件,但不幸的是他们的代码不支持多个属性。 但您可以编写自己的查询来实现目标。

$args = array(
'post_type' => 'product',
'tax_query' => array(
    array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'pa_color',
            'field'    => 'term_id',
            'terms'    => array( 'red' ),
        ),
        array(
            'taxonomy' => 'pa_size',
            'field'    => 'term_id',
            'terms'    => array( 'Long' ),
        ),
    ),
),
);
$products = new WP_Query( $args );
print_r($products);

答案 2 :(得分:0)

尝试这样请求:

products?attribute=pa_color&attribute_term=51,50&per_page=100

它为我工作。 最新的woocommerce-api wc / v2!

答案 3 :(得分:0)

在 WooRest API v3 上测试后,您可以传递多个术语分类 ID。 您必须传递一个以逗号分隔的 id 字符串,这将被 WooRest API v3 解析为一个数组。

像这样:

/wp-json/wc/v3/products/?category=1,2,3,4

不要忘记编码查询参数或使用 Automattic\WooCommerce 包 享受,