Вопрос или проблема
Я создал Revolution Slider, который загружает пользовательский тип записи, События. Есть два пользовательских поля: Дата начала события и Дата окончания события. Я хотел бы вывести сортировку по дате начала и дате окончания. Потому что сейчас возможно сортировать только по дате начала, а если дата начала одинаковая, то будет сортировать по заголовку.
Вот что я нашел на сайте Revolution Slider:
https://www.themepunch.com/faq/sort-options-post-based-sliders/
function modify_slider_order($query, $slider_id) {
if($slider_id == 4) {
$query['meta_key'] = 'event_start_date';
$query['orderby'] = 'event_start_date';
$query['meta_type'] = 'DATE';
$query['order'] = 'ASC';
}
return $query;
}
add_filter('revslider_get_posts', 'modify_slider_order', 10, 2);
Однако я не могу добавить массив в ‘orderby’. Согласно этому:
http://www.billerickson.net/wp-query-sort-by-meta/
'orderby' => array(
'event_start_date' => 'ASC',
'event_end_date' => 'ASC',
),
Может кто-то подскажет, как изменить ‘orderby’?
Спасибо!
Чтобы отсортировать по дате окончания события или дате начала, вам нужно написать отдельные функции и вызывать их по мере необходимости. Например, если пользователь нажимает на сортировку по началу, тогда должна быть вызвана функция начала.
switch($orderby){
case: 'event-start':
# ваш код
/*
$query['meta_key'] = 'event_start_date';
$query['orderby'] = 'event_start_date';
*/
break;
case 'event-end':
# ваш код
/*
$query['meta_key'] = 'event_end_date';
$query['orderby'] = 'event_end_date';
*/
break;
}
Ответ или решение
Чтобы настроить порядок сортировки в Revolution Slider с использованием двух пользовательских полей даты (даты начала и конца события), вам потребуется модифицировать запрос к базе данных, чтобы он сортировал записи в нужном вам порядке. Это можно сделать, изменив функцию modify_slider_order
, чтобы учитывать оба поля в сортировке.
Шаг 1: Изменение функции modify_slider_order
Ваша текущая функция реализует сортировку только по полю event_start_date
. Чтобы добавить сортировку по обоим полям, нужно будет расширить логику функции. Ниже приведён пример кода, который демонстрирует, как можно охватить оба поля в запросе:
function modify_slider_order($query, $slider_id) {
if($slider_id == 4) {
// Задайте массив для сортировки
$query['orderby'] = array(
'event_start_date' => 'ASC',
'event_end_date' => 'ASC',
'title' => 'ASC' // Если требуется сортировка по заголовку для записей с одинаковыми датами
);
// Убедитесь, что указаны также ключи метаданных
$query['meta_key'] = 'event_start_date'; // Это нужно для правильной выдачи результата запроса
$query['meta_type'] = 'DATE'; // Указываем, что тип данных - дата
$query['order'] = 'ASC';
}
return $query;
}
add_filter('revslider_get_posts', 'modify_slider_order', 10, 2);
Шаг 2: Обработка сортировки по запросу пользователя
Если у вас есть возможность менять сортировку по запросу пользователя (например, при нажатии на кнопки), вы можете реализовать функцию для обработки этой логики:
function dynamic_slider_order($query, $slider_id, $orderby) {
if($slider_id == 4) {
switch ($orderby) {
case 'event-start':
$query['orderby'] = 'event_start_date';
break;
case 'event-end':
$query['orderby'] = 'event_end_date';
break;
default:
// Порядок по умолчанию если ничего не было выбрано
$query['orderby'] = array(
'event_start_date' => 'ASC',
'event_end_date' => 'ASC',
);
break;
}
// Общие параметры запроса
$query['meta_key'] = 'event_start_date';
$query['meta_type'] = 'DATE';
$query['order'] = 'ASC';
}
return $query;
}
add_filter('revslider_get_posts', 'dynamic_slider_order', 10, 3);
Заключение
Теперь у вас есть два подхода: статическое и динамическое управление порядком сортировки, учитывающее два пользовательских поля. Это решение не только позволит вам контролировать порядок отображения событий, но и обеспечит гибкость для дальнейших улучшений. Не забудьте тестировать изменения в безопасной среде перед развертыванием на рабочем сайте, чтобы убедиться, что всё функционирует корректно.