使用自定义字段 ID:_diameter
woocommerce_wp_text_input(
array(
'id' => '_diameter',
'label' => __('Diameter', 'woocommerce'),
'placeholder' => __('Enter diameter...', 'woocommerce'),
'desc_tip' => 'true',
'description' => __('Enter the diameter for this product.', 'woocommerce'),
'type' => 'number',
'custom_attributes' => array(
'step' => 'any',
'min' => '0'
)
)
);
它存储了车轮的值。 15-28
用户选择汽车插件的 YearMakeModel 后,将两个值:Min_Diameter、Max_Diameter 写入 Cookie...
现在我需要根据这两个值对我的轮子进行排序。假设用户选择汽车并且值为最小值:19,最大值:21,那么它应该按 19-21 中的值以及其他值对车轮进行排序(不是筛选)。
根据文档:WP_Query这应该可以解决问题。但由于某种原因不工作。尝试使用 Between 和 IN
function custom_sort_by_recommended( $sort_args ) {
if ( isset( $_GET['orderby'] ) && $_GET['orderby'] == 'recommended' ) {
// Read cookie values
$min_diameter = isset( $_COOKIE['Min_Diameter'] ) ? intval( $_COOKIE['Min_Diameter'] ) : 0;
$max_diameter = isset( $_COOKIE['Max_Diameter'] ) ? intval( $_COOKIE['Max_Diameter'] ) : PHP_FLOAT_MAX;
// Modify the query args
$sort_args['meta_query'] = array(
'relation' => 'AND',
array(
'key' => '_diameter',
'value' => array( $min_diameter, $max_diameter ),
'compare' => 'BETWEEN',
)
);
// Custom sorting order
$sort_args['orderby'] = array(
'meta_value_num' => 'ASC', // Sort by diameter ascending
);
}
return $sort_args;
}
我想你已经将你的函数挂在了
woocommerce_get_catalog_ordering_args
钩子中。
我还假设您添加了自定义“推荐”排序选项,例如:
add_filter( 'woocommerce_catalog_orderby', 'add_catalog_orderby_recommended' );
function add_catalog_orderby_recommended( $orderby ) {
$orderby['recommended'] = 'Sort by recommended';
return $orderby;
}
现在,请注意
$sort_args
仅处理“orderby”和“order”,但不处理“meta_query”。
然后您将用以下内容替换现有的挂钩函数:
add_filter( 'woocommerce_get_catalog_ordering_args', 'catalog_ordering_by_recommended', 10, 3 );
function catalog_ordering_by_recommended( $args, $orderby, $order ) {
if ( isset( $_GET['orderby'] ) && $_GET['orderby'] === 'recommended' ) {
// Custom sorting order
$args['orderby'] = array(
'meta_value_num' => 'ASC', // Sort by diameter ascending
);
}
return $args;
}
add_filter( 'woocommerce_product_query', 'product_query_by_recommended', 10, 1 );
function product_query_by_recommended( $q ) {
if ( isset($_GET['orderby']) && $_GET['orderby'] === 'recommended' ) {
// Read cookie values
$min_diameter = isset( $_COOKIE['Min_Diameter'] ) ? intval( $_COOKIE['Min_Diameter'] ) : 0;
$max_diameter = isset( $_COOKIE['Max_Diameter'] ) ? intval( $_COOKIE['Max_Diameter'] ) : PHP_FLOAT_MAX;
$meta_query = $q->get('meta_query');
$meta_query['relation'] = 'AND';
$meta_query[] = array(
'key' => '_diameter',
'value' => array( $min_diameter, $max_diameter ),
'compare' => 'BETWEEN',
'type' => 'NUMERIC',
);
$q->set('meta_query', $meta_query);
$q->set('orderby', array(
'meta_value_num' => 'ASC', // Sort by diameter ascending
) );
}
}
应该可以。