几乎所有在woocommerce网站上实现价格排序的指南都是相同的。我尝试了两种主要方法。 1-像这样从功能.php连接我的查询参数:
add_filter('woocommerce_get_catalog_ordering_args', 'my_custom_woocommerce_catalog_orderby');
function my_custom_woocommerce_catalog_orderby( $args ) {
if(isset($_GET['sort'])){
if($_GET['sort_by'] == 'by_rating'){
$args['meta_key'] = '_wc_average_rating';
} else if($_GET['sort_by'] == 'by_price') {
$args['meta_key'] = '_price';
}
$args['orderby'] = 'meta_value_num';
$args['order'] = strtoupper($_GET['sort']);
}
return $args;
}
var_dump显示它已被捕获:
array(3) { ["orderby"]=> string(14) "meta_value_num" ["order"]=> string(4) "DESC" ["meta_key"]=> string(6) "_price" }
但是产品仍然按照默认的woocommerce设置(价格,升序)进行排序。
然后我实现了我的过滤器插件(效果很好),并尝试向其添加排序查询。
class My_blah_blah_filter {
public static $instance;
public $productquery;
public static function init() {
if ( is_null( self::$instance ) ) {
self::$instance = new My_blah_blah_filter ();
}
return self::$instance;
}
private function __construct() {
add_action( 'woocommerce_product_query', [ $this, 'filter_by_current_range' ] );
}
public function filter_by_current_range( $query ) {
$this->productquery = $query;
$query->set('tax_query', $this->get_tax_query());
if(isset($_GET['sort'])){
if($_GET['sort_by'] == 'by_rating'){
$query->set('meta_key', '_wc_average_rating');
} else if($_GET['sort_by'] == 'by_price') {
$query->set('meta_key', '_price');
} else {
$query->set('meta_key', '_price');
}
$query->set('orderby', 'meta_value_num');
$query->set('order', strtoupper($_GET['sort']));
}
}
public function get_tax_query() {
// pa_space-overall
$tax_query = [];
if( isset( $_GET['max_so'] ) && isset( $_GET['min_so'] ) ) {
$terms = get_terms([
'taxonomy' => 'pa_space-overall',
]);
$rlt = [];
foreach( $terms as $term ) {
if( (int) $term->name <= (int) $_GET['max_so'] && (int) $term->name >= (int) $_GET['min_so'] ) {
$rlt[] = $term->term_id;
}
}
$tax_query = [
'relation' => 'AND',
[
'taxonomy' => 'pa_space-overall',
'terms' => $rlt,
'operator' => 'IN',
],
];
}
if( isset( $this->productquery->tax_query ) ) {
$tax_query = array_merge( $this->productquery->query_vars['tax_query'], $tax_query );
}
return $tax_query;
}
这里有些东西是硬编码的,但事实并非如此,它的工作原理。但不是订购。它仍然被捕获,被添加到查询中,但是顺序仍然是默认的(价格,升序-来自woocommerce设置) 除了woocommerce之外,唯一的插件是高级自定义字段,与之无关。
无法在其他任何地方找到任何解决方案。有什么建议么?提前致谢。 对不起,英文不好或代码格式不正确