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