Чтобы сделать сортировку записей по полю, которое является датой, используя хук pre_get_posts, нужно настроить параметры запроса с помощью метода $query->set().
Вот пример кода:
function sort_posts_by_date_field( $query ) {
// Проверяем, чтобы это был основной запрос (main query) и не был запрос в админке
if ( ! is_admin() && $query->is_main_query() ) {
// Убедитесь, что это нужный тип записей или архив
if ( $query->is_post_type_archive( 'your_post_type' ) || $query->is_tax( 'your_taxonomy' ) ) {
// Укажите мета-ключ вашего поля с датой
$meta_key = 'your_date_field';
// Настраиваем параметры запроса
$query->set( 'meta_key', $meta_key );
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_type', 'DATE' ); // Указываем тип поля (дата)
$query->set( 'order', 'ASC' ); // Или DESC, если нужно в обратном порядке
}
}
}
add_action( 'pre_get_posts', 'sort_posts_by_date_field' );
Объяснение:
- Проверка запроса:
is_admin()исключает выполнение кода в админке.is_main_query()проверяет, является ли это основной запрос (чтобы не затронуть второстепенные запросы).
- Проверка типа архива:
is_post_type_archive( 'your_post_type' )используется для конкретного типа записей.is_tax( 'your_taxonomy' )проверяет архивы для определенной таксономии.
- Сортировка:
meta_key— ключ вашего пользовательского поля.orderby— указывает, что сортировать нужно по значению мета-поля.meta_type— важный параметр, указывающий, что это поле с типомDATE.order— порядок сортировки (ASCдля возрастающего илиDESCдля убывающего).
Пример с реальным полем:
Если у вас есть пользовательское поле с ключом event_date, вы можете заменить 'your_date_field' на 'event_date'.
Примечания:
- Убедитесь, что поле с датой сохраняется в формате
YYYY-MM-DDдля корректной сортировки. - Если формат даты отличается (например,
dd-mm-yyyy), нужно дополнительно преобразовать значения в формате запроса.

















