Вопрос или проблема
На cascadeoc.org/results у меня есть результаты, отсортированные по пользовательскому полю “event_date_results”, что соответствует дате, когда произошло событие (а не дате публикации поста). Однако, когда есть несколько результатов за один день, я хотел бы дополнительно управлять порядком постов по дате и ВРЕМЕНИ публикации. Как я могу добавить этот второй фильтр orderby?
Вот что у меня есть:
<?php
$query = new WP_Query( array(
'post_type' => 'result',
'posts_per_page' => 100,
//'paged' => $paged,
'meta_key' => 'event_date_results',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'meta_value' => date('Ymd'),
'meta_compare' => '<',
'date_query' => array(
array(
'key' => 'date',
'value' => date('Ymd'),
'compare' => '<', //less than
'type' => 'DATETIME'
)
),
) );
?>
Я нашел эту ссылку о “более мощном ORDER BY в WordPress 4.0“, и это привело меня к попытке использовать этот код:
<?php
$query = new WP_Query( array(
'post_type' => 'result',
'posts_per_page' => 100,
//'paged' => $paged,
'meta_key' => 'event_date_results',
'orderby' => array( 'meta_value_num' => 'DESC', 'post_date' => 'DESC'),
//'order' => 'DESC',
'meta_value' => date('Ymd'),
'meta_compare' => '<',
'date_query' => array(
array(
'key' => 'date',
'value' => date('Ymd'),
'compare' => '<', //less than
'type' => 'DATETIME'
)
),
) );
?>
Строка ‘orderby’ — это единственное, что я изменил (и я закомментировал другую строку ‘DESC’, которую мог бы теперь удалить.)
…не обращайте внимания на мой закомментированный фрагмент ‘paged’… Я всё ещё разбираюсь, как реализовать пагинацию. 😉
Ответ или решение
Вопрос о сортировке записей в WordPress на основании нескольких переменных, таких как метаполе event_date_results
, дата и время публикации, представляет собой интересную и частую задачу в веб-разработке. Это особенно актуально для проектов, где важен точный порядок вывода информации, например, в случае списка результатов событий на сайте cascadeoc.org/results
.
Теория
В WordPress сортировка записей может осуществляться по различным критериям, которые определяются с помощью параметра orderby
в классе WP_Query
. Этот параметр позволяет задавать как одиночные, так и множественные условия сортировки. В нашем случае нам необходимо сортировать результаты по метаполю event_date_results
, затем дополнительно применять сортировку по дате и времени публикации поста, чтобы у нас была возможность упорядочить записи с одинаковой датой события. Для этого используем возможности, появившиеся в WordPress 4.0, которые позволяют комбинировать несколько условий сортировки.
Пример
Ваш код для организации сортировки:
$query = new WP_Query( array(
'post_type' => 'result',
'posts_per_page' => 100,
'meta_key' => 'event_date_results',
'orderby' => array(
'meta_value_num' => 'DESC',
'post_date' => 'DESC'
),
'meta_value' => date('Ymd'),
'meta_compare' => '<',
'date_query' => array(
array(
'key' => 'date',
'value' => date('Ymd'),
'compare' => '<',
'type' => 'DATETIME'
)
),
) );
Вы используете WP_Query
для выборки записей с определённым типом result
, устанавливаете количество записей на странице, и затем настраиваете сортировку с помощью параметра orderby
. Сортировка по meta_value_num
обрабатывает числовые значения вашего метаполя event_date_results
, а сортировка по post_date
отвечает за порядок по дате и времени публикации.
Применение
Чтобы применить данный подход в реальном проекте, нужно учесть несколько ключевых аспектов:
-
Корректная структура метаполей: Убедитесь, что значения в вашем метаполе
event_date_results
хранятся в числовом формате, который может быть правильно интерпретирован в SQL-запросах, т.е., в форматеYmd
(например, 20231021 для 21 октября 2023). -
Использование современных возможностей WordPress: Версия WordPress 4.0 и выше поддерживает использование массива в параметре
orderby
, что позволяет комбинировать несколько методов сортировки. Это особенно полезно, если необходимо выполнять точную сортировку по нескольким критериям. -
Тестирование на производительность: При использовании сложных запросов важно тестировать их на производительность, особенно когда количество записей большое. Убедитесь, что запросы возвращаются быстро и не нагружают сервер.
-
Пагинация: Важно правильно настроить пагинацию, особенно если результатов много. В вашем коде уже указано возможное использование пагинации через
$paged
, но без полной реализации. Это нужно доработать, чтобы пользователи могли с лёгкостью перемещаться по страницам с результатами. -
Совместимость с плагинами и темами: Убедитесь, что ваше решение совместимо с установленными плагинами и используемой темой, чтобы избежать конфликтов, которые могут повлиять на работу вашего сайта.
-
Обработка ошибок: Настройте обработку ошибок в случае, если ваш запрос будет возвращать пустой результат или столкнётся с проблемой выполнения. Это улучшит пользовательский опыт и упростит диагностику проблем.
Исходя из вышеизложенной теории и примера, ваша задача будет состоять в тщательном тестировании и возможной оптимизации кода, чтобы реализовать быструю и эффективную сортировку записей по заданным критериям. Рассмотрите возможность использования дополнительных инструментов кеширования результатов, если замечаете замедление работы сайта при увеличении объёмов данных.