Вопрос или проблема
Я не эксперт в многих вопросах, поэтому, пожалуйста, извините меня, если это простой вопрос… но он сводит меня с ума.
У меня есть шаблон архива (адаптированный от стандартного шаблона темы ‘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: Логическая структура
Каждый из блоков кода отвечает за отдельную задачу:
- Получение терминов таксономии: В первом блоке вы получите все уникальные значения таксономии
booktype
, отсортированные по имени. - Вывод постов по таксономиям: Во втором блоке вы создаете новый объект
WP_Query
для получения постов с данным значениемbooktype
, и теперь они будут отсортированы по заголовку.
Шаг 4: Альтернативные способы сортировки (по желанию)
Если вы хотите увеличить уровень сложность, можно использовать многомерную сортировку, добавив дополнительные параметры. Например, если вам также нужно отсортировать по name
, вы можете сделать следующее:
$args = array(
'post_type' => 'fiction',
'booktype' => $term->slug,
'orderby' => array( 'title' => 'ASC', 'name' => 'ASC' )
);
Шаг 5: Проверка и отладка
Не забудьте провести полное тестирование, чтобы убедиться, что все работает корректно. Если после внесения изменений не отображаются посты, убедитесь, что:
- Все термины, которые вы ожидаете, действительно существуют в базе данных.
- Посты имеют правильное значение для
booktype
.
Заключение
Теперь у вас есть структура кода, которая позволяет правильно сортировать ваши посты по заголовку внутри категорий. Если возникнут дополнительные вопросы, всегда можно обратиться к документации WordPress или сообществу для получения дополнительной поддержки.