Практически все руководства по реализации сортировки цен на сайте woocommerce одинаковы. Я пробовал два основных способа. 1-й - подключил аргументы моего запроса из functions.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 - это расширенные настраиваемые поля, которые тут ни при чем.
Не могу найти решения где-нибудь еще. Какие-либо предложения? Заранее спасибо. Извините за плохой английский или не идеально отформатированный код





