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

Ссылка скопирована
1 ответ

У меня есть страница со всеми услугами и она разбита на категории, тоесть как сделать чтобы определённые посты выводились в соответствующем его категории блоке.

Ещё у меня сделана фильтрация по кнопкам на 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 поста:". Зачем? Типа, не мала баба клопоту та й купыла порося. Или я чего то недопонял?

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Для такой страницы услуг лучше не выводить всё через один get_posts() и потом пытаться вручную раскладывать записи. Правильнее сделать отдельную таксономию или использовать рубрики, получить список терминов, а внутри каждого термина вывести связанные записи. Тогда администратор добавляет новую категорию услуг, и она автоматически появляется и в кнопках фильтра, и в блоках на странице.

    Схема такая:

    • создаёте тип записи service или используете записи, если проект маленький;
    • создаёте таксономию service_category;
    • каждой услуге назначаете категорию;
    • на странице получаете термины и по каждому термину делаете WP_Query.

    Пример вывода кнопок:

    $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>';
    }

    $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();
    }

    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-фильтр, но архитектурно категории всё равно должны жить в таксономии, а не в ручном массиве.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно