提问者:小点点

在WooCommerce Rest API调用中按多重属性及其属性术语筛选产品列表


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

我从Rest API获取产品列表

“wp json/wc/v3/products”

我能够过滤产品使用

“wp json/wc/v3/productscategory=241

并使用

"wp-json/wc/v3/产品?属性=pa_flavor

我需要在RESTAPI中过滤具有多个属性的产品(如pa_味道、pa_大小、pa_颜色等)。你怎么能这么做?


共2个答案

匿名用户

按多个属性为过滤器产品创建自定义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/?类别=kurtis

价格:

/wp-json/wp/v3/filter/product/?过滤器[min_price]=500

匿名用户

我认为这里的问题不是怎么做,而是为什么这样做?哪种方法对你来说是最好的方法?

你描述的基本上是类别,如果是这样的话,你可以。

https://woocommerce.github.io/woocommerce-rest-api-docs/#retrieve-a-产品类别

请求:

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

/wp json/wc/v3/产品/类别/

现在如果你想通过属性拉

您可以检索它们自己使用的属性

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

我想请您阅读Woocoomerece Api上的文档,老实说,它非常广泛。

如果你想完全控制这一切。我建议设置类别或标签,然后在所述类别或标签下添加产品,然后拉这些标签/类别

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