В работе с WordPress часто возникает необходимость вывести список постов с уникальным, нестандартным порядком, который нельзя задать стандартными параметрами WP_Query, такими как дата или алфавит. В этой статье разберём, как создать автоматический список постов с уникальным порядком, используя пользовательские поля и сортировку по ним. Это полезно для сайтов, где нужно гибко управлять выводом контента без постоянного ручного редактирования.
Почему стандартных методов сортировки недостаточно
WordPress по умолчанию позволяет сортировать посты по дате публикации, названию, ID, популярности и т.д. Однако, если вам нужно вывести, например, список постов, отсортированный по произвольному порядку, заданному в отдельном поле, или по нескольким критериям одновременно, стандартных возможностей WP_Query не хватит.
Например, можно захотеть выводить важные статьи вверху, а остальные — в хронологическом порядке, или отсортировать по рейтингу, заданному редактором. Для таких задач нужно использовать мета-запросы и сортировку по мета-значениям.
Использование пользовательских полей для уникального порядка
Для начала создадим в постах пользовательское поле, которое будет отвечать за порядок. Допустим, это поле wporder_custom_order. Значение — число, чем меньше число, тем выше позиция поста.
Вы можете добавить это поле вручную в админке или через специальный плагин, например, Advanced Custom Fields (ACF). Также можно сделать редакторское поле прямо в интерфейсе редактирования поста.
После этого можно написать запрос, который будет сортировать посты по этому полю.
Пример кода для запроса постов с уникальным порядком
function wplog_get_custom_ordered_posts($posts_per_page = 10) {
$args = array(
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'meta_key' => 'wporder_custom_order',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'wporder_custom_order',
'compare' => 'EXISTS'
)
)
);
$query = new WP_Query($args);
return $query->posts;
}Этот код получает посты, у которых есть поле wporder_custom_order, сортирует их по числовому значению этого поля в порядке возрастания.
Вы можете вывести эти посты в любом месте темы, например, в шаблоне, вызвав функцию и пройдясь по массиву.
Автоматическая генерация значения пользовательского поля
Ручное заполнение поля для большого количества постов неудобно. Можно автоматизировать присвоение значения этого поля при публикации поста, чтобы создать уникальный порядковый номер.
Например, можно при первом сохранении поста проставлять ему порядковый номер, равный количеству уже опубликованных постов + 1. Для этого добавим хук на сохранение:
function wplog_set_custom_order_on_save($post_id) {
// Проверяем тип поста
if (get_post_type($post_id) !== 'post') {
return;
}
// Проверяем, не автосохранение ли это
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Проверяем, если поле уже установлено, ничего не меняем
$existing_order = get_post_meta($post_id, 'wporder_custom_order', true);
if (!empty($existing_order)) {
return;
}
// Получаем количество опубликованных постов
$count = wp_count_posts('post')->publish;
// Присваиваем порядковый номер
update_post_meta($post_id, 'wporder_custom_order', $count + 1);
}
add_action('save_post', 'wplog_set_custom_order_on_save');Этот код гарантирует, что каждый новый пост получает уникальное число в поле wporder_custom_order, что упрощает сортировку.
Использование плагинов для управления порядком
Если вы не хотите писать код, можно использовать плагины. Вот несколько полезных:
- Simple Custom Post Order — позволяет менять порядок постов через drag and drop в админке, автоматически сортирует вывод.
- Post Types Order — похожий плагин с расширенными возможностями сортировки произвольных типов записей.
- Clearfy Pro — пакет оптимизаций и инструментов, который может помочь с управлением контентом и повышением производительности.
Использование плагинов удобно, если вы не хотите погружаться в код, но для тонкой настройки и интеграции лучше писать свои решения.
Вывод и отображение списка постов с уникальным порядком
После того как вы получили массив постов из функции wplog_get_custom_ordered_posts(), можно вывести их в шаблоне так:
$posts = wplog_get_custom_ordered_posts(20);
echo '<ul>';
foreach ($posts as $post) {
echo '<li><a href="' . get_permalink($post) . '">' . esc_html(get_the_title($post)) . '</a></li>';
}
echo '</ul>';Такой список будет отображён строго в том порядке, который вы задали в пользовательском поле, и обновляться автоматически с добавлением новых постов.
Дополнительные возможности
Можно расширить функционал, добавив:
- Фильтрацию по категориям и таксономиям.
- Поддержку кастомных типов записей.
- Интерфейс для редактирования порядка из админки.
- Кэширование результатов для повышения производительности.
Это позволит сделать список постов максимально гибким и удобным для пользователей.