Пользовательский фильтр запросов не работает на странице категории woocommerce
Я пытаюсь создать пользовательский фильтр для своего веб-сайта woocommerce. На странице магазина все работает нормально, но когда я перехожу на страницу архива, фильтры не работают. Я записываю каждое свойство фильтра в URL-адрес.
Код на странице магазина работает, но на странице архива (категория) он не работает. Кто-нибудь знает, как управлять SQL-запросом на странице архива? Мой текущий код:
function modify_query($query) { if(!is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product') { if(isset($_GET["fillter"])) { $arr[] = array( 'taxonomy' => 'pc_filters', 'field' => 'term_id', 'terms' => $_GET["fillter"], ); $query->set('tax_query', array( 'relation' => 'AND', array($arr) ) ); return $query; } } } add_action('pre_get_posts', 'modify_query');
Но он работает только в страница магазина.
1 answers
На первый взгляд я не уверен, почему это работает только на вашей домашней странице, а не на страницах вашего архива, но в том, как написана эта функция, есть несколько ошибок. Итак, я переписал его для вас ниже - использование этого вместо может решить проблему, если раньше она вводила эзотерическую ошибку.
Несколько вещей, которые следует отметить:
-
relation
не следует использовать сtax_query
, когда имеется только один внутренний запрос ( ссылка) - ваш
tax_query
было три массива глубиной - должно быть только два - поскольку
pre_get_posts
является действием, возвращаемое значение не принимается (в этом случае$query
передается по ссылке , поэтому его не нужно возвращать) -
"filter"
было написано с ошибкой как"fillter"
(хотя это само по себе не нарушило бы код, могло перепутать вас во время тестирования, если вы использовали?filter=
в строке запроса) - Я также добавил очистку переменной строки запроса, которую вы вводите, путем абсент() учитывая, что это
term_id
С учетом сказанного, вот упрощенная функция:
function modify_query($query) {
if( ! is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product') {
if( isset( $_GET['filter'] ) ) {
$query->set( 'tax_query', array (
array(
'taxonomy' => 'pc_filters',
'field' => 'term_id',
'terms' => absint( $_GET['filter'] ),
)
));
}
}
}
add_action( 'pre_get_posts', 'modify_query' );
Я не проверял это, но это должно сделать то, что вы намеревались, немного проще, что может решить вашу проблему.
Если это не решит проблему, это может быть связано с запросом, который WooCommerce использует на страницах архива, в частности, значением query_vars['post_type']
. Специфика WooCommerce здесь не по теме, и я сам с ней не знаком, но что касается общего WordPress, вы можете использовать print_r($query->query_vars);
в вышеупомянутой функции, чтобы увидеть, с чем вам нужно работать, а затем соответствующим образом изменить. В качестве альтернативы вы можете полностью удалить проверку post_type
, хотя тогда этот код будет также применяться к вашим общим публикациям и страницам, которые могут быть не тем, что вам нужно.