Пользовательский фильтр запросов не работает на странице категории 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');

Но он работает только в страница магазина.

Author: Sky, 2016-05-25

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, хотя тогда этот код будет также применяться к вашим общим публикациям и страницам, которые могут быть не тем, что вам нужно.

 2
Author: Tim Malone, 2016-07-04 23:25:52