Как сделать фильтр постов по категориям?
Как сделать фильтр постов по категориям, как на фото?
Фильтр делается не на странице архива, а на обычной странице.
Дополнительно
Ответы:
В общем случае как-то так. Передаете GET или POST параметр с id категории и добавляете к аргументам основного запроса tax_query get_posts(array( 'post_type' => 'post', 'status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => ( isset( $_GET['category_id'] ) && intval($_GET['category_id']) ) ? intval($_GET['category_id']) : $default_cat_id , ) ), ) ); |
В общем случае как-то так. Передаете GET или POST параметр с id категории и добавляете к аргументам основного запроса tax_query get_posts(array( 'post_type' => 'post', 'status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'id', 'terms' => ( isset( $_GET['category_id'] ) && intval($_GET['category_id']) ) ? intval($_GET['category_id']) : $default_cat_id , ) ), ) );
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

На обычной странице фильтр постов по категориям делается через параметр в URL или AJAX. Самый простой вариант без AJAX: форма отправляет
catметодом GET, аWP_Queryполучает выбранную категорию и строит список записей.$selected_cat = isset($_GET['cat']) ? absint($_GET['cat']) : 0; $args = [ 'post_type' => 'post', 'posts_per_page' => 12, 'paged' => max(1, get_query_var('paged')), ]; if ($selected_cat) { $args['cat'] = $selected_cat; } $query = new WP_Query($args);
Форма:
<form method="get"> <select name="cat"> <option value="0">Все категории</option> <?php foreach (get_categories() as $cat) : ?> <option value="<?php echo esc_attr($cat->term_id); ?>" <?php selected($selected_cat, $cat->term_id); ?>> <?php echo esc_html($cat->name); ?> </option> <?php endforeach; ?> </select> <button type="submit">Фильтровать</button> </form>
Если нужен фильтр как на картинке с кнопками, вместо select выводите ссылки с
?cat=ID. Для нескольких категорий используйтеcategory__in. Если страница статическая, не используйтеquery_posts(): он ломает глобальный запрос и пагинацию. Создавайте отдельныйWP_Queryи после цикла вызывайтеwp_reset_postdata().Для AJAX-версии принцип тот же, только выбранный ID категории отправляется в обработчик, а сервер возвращает HTML карточек. Не фильтруйте записи только на фронте, если записей много: вы сначала загрузите лишний контент, а потом спрячете его CSS-ом. Это плохо для скорости. Если нужны красивые URL, можно оставить GET-параметр: он понятен, индексируемость контролируется, а пользователь может скопировать ссылку на уже отфильтрованную подборку.