В каталоге уже есть отдельный тип записей «Книги» и поле ACF book_price. Теперь выведем список книг от дешёвых к дорогим и оставим в нём только записи с заданным ценовым пределом. Для этого используется стандартный WP_Query WordPress: ACF хранит значение поля, а WordPress ищет записи по метаданным.

Как WordPress видит значение ACF

Для поиска передайте в запросе имя поля из настроек ACF. Если поле называется book_price, именно это имя будет ключом в условии meta_query. Подпись «Цена» в админке в запросе не используется.

Для числового сравнения задайте тип NUMERIC. Иначе сравнение может трактовать данные как текст: например, сортировать строки символ за символом, а не сравнивать числа. При сортировке по числовому метаполю WordPress использует meta_value_num.

Находим книги до заданной цены

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

<?php
$args = array(
    'post_type'      => 'book',
    'post_status'    => 'publish',
    'posts_per_page' => 12,
    'meta_query'     => array(
        array(
            'key'     => 'book_price',
            'value'   => 1500,
            'compare' => '<=',
            'type'    => 'NUMERIC',
        ),
    ),
    'meta_key'       => 'book_price',
    'orderby'        => 'meta_value_num',
    'order'          => 'ASC',
);

$books = new WP_Query( $args );

if ( $books->have_posts() ) :
    while ( $books->have_posts() ) :
        $books->the_post();
        $author = get_field( 'book_author' );
        $price  = get_field( 'book_price' );
        ?>

        <article class="book-result">
            <h2>
                <a href="<?php echo esc_url( get_permalink() ); ?>">
                    <?php echo esc_html( get_the_title() ); ?>
                </a>
            </h2>

            <?php if ( $author ) : ?>
                <p>Автор: <?php echo esc_html( $author ); ?></p>
            <?php endif; ?>

            <p>Цена: <?php echo esc_html( $price ); ?> ₽</p>
        </article>

    <?php endwhile;
else : ?>
    <p>Подходящих книг пока нет.</p>
<?php endif;

wp_reset_postdata();

Замените число 1500 на нужный предел. posts_per_page ограничивает размер одной страницы каталога, а wp_reset_postdata() восстанавливает контекст основной страницы после дополнительного запроса.

Что делать с книгами без цены

Книги, у которых метаполе цены не сохранено, обычно не попадут в числовое условие. Если цена обязательна для публикации, сделайте поле обязательным в группе ACF. Если книги без цены допустимы, определите отдельно, куда их помещать: в общий список после сортируемых или в специальный блок «Цена уточняется».

Не используйте текстовое поле для числовой цены, если по ней нужно сортировать и фильтровать. Поле ACF типа «Число» помогает редактору вводить значение последовательно, а type => NUMERIC объясняет запросу, как его сравнивать.

Когда такой запрос подходит

meta_query хорошо подходит для небольшого каталога с понятным числом условий: цена меньше лимита, год равен заданному, флаг «Рекомендуем» включён. Если фильтров много, записей очень много или нужна сложная фасетная навигация, запросы по метаданным могут стать узким местом. Тогда отдельно оценивают структуру данных и индексы базы, а не добавляют десятки условий вслепую.

Теперь у вас есть полный путь для простого каталога: отдельный тип записей, поля ACF, повторяемые главы, перенос определений и запрос к записям по цене. Следующий самостоятельный шаг — добавить пагинацию или фильтр по автору, сохраняя проверку имени поля и числового типа.

Документация

Продолжение мини-курса

  1. Предыдущая часть: собираем карточку книги.
  2. Создаём отдельный тип записей «Книги».
  3. Списки глав через Repeater.
  4. Переносим группы полей через Local JSON.