在Woocommerce Rest API调用中按Mutiple属性及其属性项过滤产品列表

时间:2019-12-02 08:47:15

标签: android ios woocommerce woocommerce-rest-api

我正在开发移动应用程序,以连接iOS和Android中的WooCommerce wordpress V3 rest API。

我正在从Rest API获取产品列表

“ wp-json / wc / v3 / products”

我可以使用以下产品过滤产品

“ wp-json / wc / v3 / productscategory = 241&attribute = pa_flavor&attribute_term = 301”

并使用

过滤多个属性项

“ wp-json / wc / v3 / products?attribute = pa_flavor&attribute_term = 301,302,305”。

我需要在rest API中过滤具有多个属性(例如pa_flavor,pa_size,pa_color等)的产品。该怎么办?

2 个答案:

答案 0 :(得分:0)

我认为这里的问题不是如何,但是为什么要这样做呢?哪种方法最适合您?

您的描述基本上是类别,因此,可以的话。

https://woocommerce.github.io/woocommerce-rest-api-docs/#retrieve-a-product-category

请求:

卷曲https://example.com/wp-json/wc/v3/products/categories/9

/ wp-json / wc / v3 / products / categories /

现在,如果要通过属性提取

您可以使用

检索它们自己的属性

/ wp-json / wc / v3 / products / attributes

我想请您阅读Wooooomerece Api上的文档。说实话,范围很广。

如果要对此进行完全控制。我建议设置类别或标签,然后在所述类别或标签下添加产品,然后拉出这些标签/类别

现在您提到您是为IOS和Android制作的,但是您使用的是什么框架。 因此,我可以为您提供一些实际的代码示例。

答案 1 :(得分:0)

创建自定义 REST API 以按多个属性过滤产品

// Create Custom REST API for Filter
add_action('rest_api_init', 'wp_rest_filterproducts_endpoints');
function wp_rest_filterproducts_endpoints($request) {
    register_rest_route('wp/v3', 'filter/products', array(
        'methods' => 'GET',
        'callback' => 'wp_rest_filterproducts_endpoint_handler',
    ));
}

function wp_rest_filterproducts_endpoint_handler($request = null) {
    $output = array();
    
    $params = $request->get_params();

    $category = $params['category'];
            
    $filters  = $params['filter'];
    $per_page = $params['per_page'];
    $offset   = $params['offset'];
    $order    = $params['order'];
    $orderby  = $params['orderby'];
    
    // Use default arguments.
    $args = [
      'post_type'      => 'product',
      'posts_per_page' => 10,
      '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' => 'product_cat',
          '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();
        $product = wc_get_product( get_the_ID() );  

        // Product Properties
        $wcproduct['id'] = $product->get_id();
        $wcproduct['name'] = $product->get_name();
                    
        $output[] = $wcproduct;
    }
    wp_reset_postdata();

    return new WP_REST_Response($output, 123);
}

请求:

/wp-json/wp/v3/filter/product/?category=kurtis&filter[pa_color]=XX,X,XXX

价格:

/wp-json/wp/v3/filter/product/?filter[min_price]=500&filter[max_price]=1000&filter[pa_color]=XX