Как правильно сделать фильтрацию постов?
У меня есть страница со всеми услугами и она разбита на категории, тоесть как сделать чтобы определённые посты выводились в соответствующем его категории блоке.
Ещё у меня сделана фильтрация по кнопкам на js, а ещё администратор сайта должен сам добавлять категории и они соответственно должны появлятся в кнопках фильтрации и плюс на странице.
Вывожу я всю информацию через ACF поста:
<?php $my_posts = get_posts( array( 'numberposts' => -1, 'category_name' => 'services', 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'suppress_filters' => true ) ); global $post; foreach ($my_posts as $post) { setup_postdata($post); ?> <li> <a href="<?php the_permalink($post); ?>" class="services__list__item"> <div class="services__list__item__image"> <img src="<?php the_field('service_image'); ?>" alt="<?php the_field('service_alt'); ?>"> </div> <div class="services__list__item__main"> <h3> <?php the_field('service_title'); ?> </h3> <p class="services__list__item__price">Від <?php the_field('service_price'); ?> грн </p> <ul> <?php if (get_field('service_repeater')): ?> <?php while (has_sub_field('service_repeater')): ?> <li> <p> <?php the_sub_field('service_repeater_item'); ?> </p> </li> <?php endwhile; ?> <?php endif; ?> </ul> <p class="services__list__item__main__details"> Детальніше <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <g id="_keyboard_arrow_right"> <path id="Vector" d="M8.29492 16.59L12.8749 12L8.29492 7.41L9.70492 6L15.7049 12L9.70492 18L8.29492 16.59Z" fill="#676767" /> </g> </svg> </p> </div> </a> </li> <?php } wp_reset_postdata(); ?> |
<?php $my_posts = get_posts( array( 'numberposts' => -1, 'category_name' => 'services', 'orderby' => 'date', 'order' => 'DESC', 'include' => array(), 'exclude' => array(), 'meta_key' => '', 'meta_value' => '', 'post_type' => 'post', 'suppress_filters' => true ) ); global $post; foreach ($my_posts as $post) { setup_postdata($post); ?> <li> <a href="<?php the_permalink($post); ?>" class="services__list__item"> <div class="services__list__item__image"> <img src="<?php the_field('service_image'); ?>" alt="<?php the_field('service_alt'); ?>"> </div> <div class="services__list__item__main"> <h3> <?php the_field('service_title'); ?> </h3> <p class="services__list__item__price">Від <?php the_field('service_price'); ?> грн </p> <ul> <?php if (get_field('service_repeater')): ?> <?php while (has_sub_field('service_repeater')): ?> <li> <p> <?php the_sub_field('service_repeater_item'); ?> </p> </li> <?php endwhile; ?> <?php endif; ?> </ul> <p class="services__list__item__main__details"> Детальніше <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <g id="_keyboard_arrow_right"> <path id="Vector" d="M8.29492 16.59L12.8749 12L8.29492 7.41L9.70492 6L15.7049 12L9.70492 18L8.29492 16.59Z" fill="#676767" /> </g> </svg> </p> </div> </a> </li> <?php } wp_reset_postdata(); ?>
А ещё такой вопрос можно ли как-то эти категории в отдельном месте создавать и потом выбирать допустим через селект acf при создании поста чтобы выбирать его категорию или же каким-то другим способом?
Дополнительно:
Ещё у меня сделана фильтрация по кнопкам на js, а ещё администратор сайта должен сам добавлять категории и они соответственно должны появлятся в кнопках фильтрации и плюс на странице.
Что значит "должны"?
, типо этого. Администратор(человек который не шарит), если захочет добавить новую категорию
Ответы:
Если с подгрузкой данных с сервера - через стандартный запрос постов + термса
Аналогично можно сделать через рест апи
Но легче сделать фильтр на лету
Если не можете найти готовое решение (это странно)
То реализуйте логику на js:
Выводите список категорий сверху, включая элемент все. У этих элементов должны быть идентификаторы, например data-id=5
В цикле вывода постов к элементам поста добавляете идентификаторы категорий данного поста, например data-category=‘3,5,7’
Пишите обработчик на кнопки категорий сверху, который будет показывать посты с совпадающим идентификатором (display:block) и скрывать с несовпадающим (display:none)
ничего создавать и выводить не надо. Уже всё выведено и создано. Для того и сделан wordpress чтоб такое реализовывать. Создали в админке категорию. Потом создали запись предназначенную для этой категории. При создании записи прикручиваете её к созданной категории. Справа есть поле, выберите категорию. Всё. Допустим у вас есть несколько записей привязанных к этой категории. Открываете в админке в боковом меню "Внешний вид" - "Меню", создаёте меню, добавляете в него вашу категорию. На странице сайта нажимаете в меню эту категорию, и у вас открывается список всех записей привязанных к этой категории. Что не так? Или я чего-то не понял? "можно ли как-то эти категории в отдельном месте создавать". Для этого существует в боковом меню, в админке, "Записи" - "Рубрики". Вот вам место для создания категорий. "потом выбирать допустим через селект acf при создании поста чтобы выбирать его категорию или же каким-то другим способом?" Повторюсь. При создании записи справа есть поле "Выберите категорию", чтобы выбрать категорию для этой записи. Что не так? "Вывожу я всю информацию через ACF поста:". Зачем? Типа, не мала баба клопоту та й купыла порося. Или я чего то недопонял?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для такой страницы услуг лучше не выводить всё через один
get_posts()и потом пытаться вручную раскладывать записи. Правильнее сделать отдельную таксономию или использовать рубрики, получить список терминов, а внутри каждого термина вывести связанные записи. Тогда администратор добавляет новую категорию услуг, и она автоматически появляется и в кнопках фильтра, и в блоках на странице.Схема такая:
serviceили используете записи, если проект маленький;service_category;Пример вывода кнопок:
$terms = get_terms([ 'taxonomy' => 'service_category', 'hide_empty' => true, ]); foreach ($terms as $term) { echo '<button class="services-filter" data-filter="' . esc_attr($term->slug) . '">'; echo esc_html($term->name); echo '</button>'; }
Пример вывода блоков по категориям:
foreach ($terms as $term) { $query = new WP_Query([ 'post_type' => 'service', 'posts_per_page' => -1, 'tax_query' => [[ 'taxonomy' => 'service_category', 'field' => 'term_id', 'terms' => $term->term_id, ]], ]); echo '<section class="services-group" data-group="' . esc_attr($term->slug) . '">'; echo '<h2>' . esc_html($term->name) . '</h2>'; while ($query->have_posts()) { $query->the_post(); get_template_part('template-parts/service-card'); } echo '</section>'; wp_reset_postdata(); }
Фильтрация на JS после этого становится простой: кнопка показывает секцию с нужным
data-group. Если Вам нужен SEO-доступ к каждой категории, лучше не скрывать всё только JS, а сделать отдельные архивы таксономии с нормальными URL. Для лендинга можно оставить JS-фильтр, но архитектурно категории всё равно должны жить в таксономии, а не в ручном массиве.