Как правильно сделать фильтрацию постов?

Для реализации фильтрации постов в WordPress, можно использовать несколько подходов. Один из них основан на использовании уже встроенных функций и хуков, другой – на создании собственных пользовательских запросов.

1. Использование встроенных функций и хуков:

a) Добавление фильтрации на стандартную архивную страницу или любую другую страницу:

- Создайте новый файл шаблона (например, custom-archive.php), в котором будет отображаться отфильтрованный список постов.
- В файле functions.php вашей темы добавьте следующий код:

         add_action( 'pre_get_posts', 'custom_filter_posts' );
         function custom_filter_posts( $query ) {
            if ( is_admin() || ! $query->is_main_query() ) {
               return;
            }
        
            if ( is_post_type_archive( 'post' ) ) {
               if ( isset( $_GET['filter'] ) ) { // Здесь 'filter' может быть заменено на имя вашего параметра фильтрации.
                  $query->set( 'meta_key', 'custom_field' ); // Здесь 'custom_field' замените на имя вашего пользовательского поля.
                  $query->set( 'meta_value', sanitize_text_field( $_GET['filter'] ) ); // Здесь 'filter' может быть заменено на имя вашего параметра фильтрации.
               }
            }
         }

- Теперь, при добавлении параметра filter к URL страницы, будут отображены только посты, значение пользовательского поля которых соответствует переданному параметру фильтрации.
Например, http://your-site.com/custom-archive?filter=example отобразит только посты, содержащие в пользовательском поле значение example.

b) Добавление фильтрации в виджет "Рубрики" для архивных страниц:

- В файле functions.php вашей темы добавьте следующий код:

         add_filter( 'widget_categories_args', 'custom_filter_widget_categories' );
         function custom_filter_widget_categories( $cat_args ) {
            $cat_args['show_count'] = 0; // Удалить, если необходимо отображать количество постов.
            return $cat_args;
         }

- Теперь виджет "Рубрики" на архивных страницах будет отображать только категории, содержащие посты.
Если необходимо отобразить количество постов в каждой категории, удалите строку $cat_args['show_count'] = 0;.

2. Создание собственной фильтрации через пользовательские запросы:

a) Создайте новый файл шаблона (например, custom-filter.php), в котором будет отображаться отфильтрованный список постов.
- Создайте форму на странице, в которой пользователь будет выбирать параметры фильтрации, например, выбор категории или тега.
- По отправке формы, обработайте переданные значения и сформируйте запрос, используя функцию get_posts() или new WP_Query(). Например:

      $args = array(
         'post_type' => 'post',
         'tax_query' => array(
            array(
               'taxonomy' => 'category',
               'field'    => 'slug',
               'terms'    => $_POST['category'], // Здесь 'category' может быть заменено на имя вашего параметра фильтрации.
            ),
         ),
      );
      $filtered_posts = get_posts( $args );

- Отобразите отфильтрованный список постов, используя цикл foreach:

      foreach ( $filtered_posts as $post ) {
         setup_postdata( $post );
         // Здесь можно выводить информацию о каждом посте, например, используя функцию the_title() или the_excerpt().
      }
      wp_reset_postdata();

Не забудьте добавить CSS-стили для отображения списка постов.

Таким образом, вы можете реализовать фильтрацию постов в WordPress, либо использовав встроенные функции и хуки, либо создав свои пользовательские запросы. Вариант выбора зависит от конкретных требований и возможностей вашего проекта.