根据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,无法在查询字符串中关联color
和size
属性。所以查询 -
products?category=17&attribute=pa_color&attribute_term=22&attribute=pa_size&attribute_term=24&
返回商店中的所有商品
有解决方法吗?
答案 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 包 享受,