Как отсортировать посты по заголовку после их сортировки по категории

Вопрос или проблема

Я не эксперт в многих вопросах, поэтому, пожалуйста, извините меня, если это простой вопрос… но он сводит меня с ума.

У меня есть шаблон архива (адаптированный от стандартного шаблона темы ‘enfold’), который я использую для отображения простого списка книг. Следуя обучающему руководству, которое я нашел в другом месте, я создал цикл ниже.

Если я правильно понимаю код, первая часть блока ниже используется для получения и сортировки значений таксономии для пользовательского типа записи. Таким образом, он находит ‘Роман’, ‘Ужас’, ‘Юмор’ и т.д. Затем он отображает записи с этими значениями таксономии вместе. У меня есть небольшая таблица с значением таксономии в заголовке и записями с этим значением таксономии в таблице. Затем у меня есть таблица для следующего типа таксономии и соответствующих записей, по одной для каждого значения таксономии.

‘orderby’ в оригинальном коде сортирует значения таксономии по имени.

Все работает идеально, за исключением того, что записи внутри каждой ‘таксономической таблицы/группы’ находятся в случайном порядке, и мне нужно сортировать их по заголовку записи.

Я хочу сортировать записи (внутри их отсортированных по таксономии таблиц) по заголовку. Как мне это сделать? Я пытался скопировать каждый кусок кода, который могу найти по этой теме, но ничего близкого к рабочему решить не удалось.

Цикл, который используется;

<?php //начинаем с получения терминов для таксономии booktype
$terms = get_terms( 'booktype', array(
    'orderby'    => 'name',
    'order'   => 'DESC',
    'hide_empty' => 0
) );
?>

<?php
foreach( $terms as $term ) {
    // Определяем запрос
    $args = array(
        'post_type' => 'fiction',
        'booktype' => $term->slug
    );
    $query = new WP_Query( $args );

    // выводим тип книги в заголовочном теге                
    echo'<h4>Тип книги ' . $term->name . '</h4>';
    echo '<table>';
    echo '<tr>';
    echo '<th>Название</th>';
    echo '<th>Автор</th> ';
    echo '<th>Опубликовано</th>';
    echo '<th>ISBN</th>';
    echo '<th>Продажи</th>';
    echo '</tr>';
    while ( $query->have_posts() ) : $query->the_post();
        ?>
        <tr>
            <td><a href="https://wordpress.stackexchange.com/questions/251081/<?php the_permalink(); ?>"><?php the_title(); ?></a></td>
            <td><?php the_field( 'book-author' ); ?></td>
            <td><?php the_field( 'book-published' ); ?></td>
            <td><?php the_field( 'book-isbn' ); ?></td>
            <td><?php the_field( 'book-sales' ); ?></td>
        </tr>
    <?php endwhile;
    echo '</table>';
    wp_reset_postdata();
} ?>

Если я попытаюсь изменить массив во втором блоке (ниже) и добавлю orderby к этому, это похоже убивает первый блок. Я просто получаю пустые таблицы с заголовками, но без записей.

    // Определяем запрос
    $args = array(
        'post_type' => 'fiction',
        'booktype' => $term->slug
    );
    $query = new WP_Query( $args );

Что еще я могу попробовать?

Вам следует изменить этот фрагмент:

// Определяем запрос
$args = array(
'post_type' => 'fiction',
'booktype' => $term->slug,
'orderby' => 'name',
'order' => 'ASC'
);

Что вы хотите сделать, так это обновить ваш вызов WP_Query, указав параметр orderby как title и ваш порядок, либо ASC, либо DESC.

// Определяем запрос
$args = array(
    'post_type' => 'fiction',
    'booktype' => $term->slug,
    'orderby' => 'title',
    'order'   => 'DESC',
);

Быстрым и грязным решением было бы использовать foreach для получения всех категорий и их сортировки по алфавиту, а затем вложенный foreach для получения всех записей в данной категории и сортировки их по алфавиту.

Не очень люблю вложенные foreach, но это должно сработать.

С помощью wp_query можно передать массив в параметре orderby. Вы даже можете задать разные критерии сортировки. Например:

$args = array(
    'post_type' => 'fiction',
    'orderby' => 'name title',
    'order'   => 'ASC',
    );

или

$args = array(
    'post_type' => 'fiction',
    'orderby' => array( 'name' => 'DESC', 'title' => 'ASC' )
    );

Это должно позволить вам выполнить многомерную сортировку (требуется WP 4.0 и выше).

Как вы зарегистрировали свою таксономию? Вам нужно сделать их “иерархическими”, чтобы можно было их сортировать.

Пример:

register_taxonomy( $taxonomy, $object_type,
        [
             'hierarchical' => true,
             'label' => __( $name ),
             'query_var' => $something,
             'rewrite' => ...
            ]
        );

Ответ или решение

Для того чтобы отсортировать посты по заголовку, после того как они были отсортированы по категории в WordPress, необходимо внести изменения в массив параметров args, который вы используете при создании объекта WP_Query.

Шаг 1: Изменение параметров запроса

В текущем коде вы сначала выполняете запрос для получения всех постов, сопоставленных с конкретной таксономией (в данном случае, booktype). Для того чтобы отсортировать посты по заголовку, необходимо добавить параметры orderby и order в массив $args. Вот как следует изменить ваш код:

// Определяем параметры запроса
$args = array(
    'post_type' => 'fiction', // Тип поста
    'booktype' => $term->slug, // Сортируем по таксономии
    'orderby' => 'title', // Сортировка по заголовку
    'order'   => 'ASC' // Или 'DESC' для обратного порядка
);

Шаг 2: Обновление цикла вывода

После внесения изменений в args, вам не нужно вносить изменений в основной цикл вывода. Код будет работать так, как и ожидалось, и посты теперь будут отображаться в порядке заголовков. Убедитесь, что после внесения всех изменений вы протестировали результат на фронт-энде вашего сайта, чтобы убедиться, что посты соответствуют вашим ожиданиям.

Шаг 3: Логическая структура

Каждый из блоков кода отвечает за отдельную задачу:

  1. Получение терминов таксономии: В первом блоке вы получите все уникальные значения таксономии booktype, отсортированные по имени.
  2. Вывод постов по таксономиям: Во втором блоке вы создаете новый объект WP_Query для получения постов с данным значением booktype, и теперь они будут отсортированы по заголовку.

Шаг 4: Альтернативные способы сортировки (по желанию)

Если вы хотите увеличить уровень сложность, можно использовать многомерную сортировку, добавив дополнительные параметры. Например, если вам также нужно отсортировать по name, вы можете сделать следующее:

$args = array(
    'post_type' => 'fiction',
    'booktype' => $term->slug,
    'orderby' => array( 'title' => 'ASC', 'name' => 'ASC' )
);

Шаг 5: Проверка и отладка

Не забудьте провести полное тестирование, чтобы убедиться, что все работает корректно. Если после внесения изменений не отображаются посты, убедитесь, что:

  • Все термины, которые вы ожидаете, действительно существуют в базе данных.
  • Посты имеют правильное значение для booktype.

Заключение

Теперь у вас есть структура кода, которая позволяет правильно сортировать ваши посты по заголовку внутри категорий. Если возникнут дополнительные вопросы, всегда можно обратиться к документации WordPress или сообществу для получения дополнительной поддержки.

Оцените материал
Добавить комментарий

Капча загружается...