Вопрос или проблема
У меня есть пользовательский тип записи для событий, и они используют поле даты ACF, чтобы упорядочить их на странице архива. Проблема в том, что навигация по записям сортирует их по дате публикации, а не по полю даты ACF. Я ищу функцию, которая изменит это поведение. Я использую конструктор страниц Elementor. Я нашел что-то похожее с 2013 года, так что не уверен, является ли это правильным способом Ссылка
Возможно, шорткод – это правильный путь, но я не совсем уверен, как это сделать.
Ответ или решение
Пост-навигация по пользовательскому полю ACF
Если у вас есть пользовательский тип записей (CPT) для событий, и вы используете поле даты ACF для упорядочивания этих событий на архивной странице, а пост-навигация по умолчанию сортирует записи на основе даты публикации, вам может потребоваться перенастроить поведение пост-навигации. Ваша задача заключается в том, чтобы сделать навигацию, которая будет учитывать дату, указанную в пользовательском поле ACF, вместо стандартной даты публикации.
Решение задачи
Для решения этой проблемы мы можем воспользоваться хуком pre_get_posts
для изменения параметров запроса и функции get_field()
для извлечения значения поля ACF. Кроме того, создадим специальную функцию для изменения поведения пост-навигации.
Шаг 1: Создание функции для выбора правильной даты
Нам нужно создать функцию в файле functions.php
вашей темы. Эта функция будет управлять сортировкой постов по полю ACF.
function modify_event_query($query) {
if (is_post_type_archive('events') && $query->is_main_query()) {
$query->set('meta_key', 'event_date'); // Предположим, что ваше поле ACF называется 'event_date'
$query->set('orderby', 'meta_value');
$query->set('order', 'ASC'); // Или 'DESC' в зависимости от ваших требований
}
}
add_action('pre_get_posts', 'modify_event_query');
Этот код изменяет основной запрос на архивной странице вашего CPT ‘events’ и устанавливает его на сортировку по значениям мета-поля ‘event_date’, которое вы задали в ACF.
Шаг 2: Обновление пост-навигации
Теперь, когда вы согласовали сортировку постов, следующая задача заключается в корректной настройке навигации между постами. Для этого вы можете использовать функцию get_adjacent_post()
:
function get_adjacent_event($in_same_term = false, $adjacent = 'next') {
global $post;
// Получение значения настройки "в одном и том же термине", если нужно
$event_date = get_field('event_date', $post->ID);
$args = array(
'post_type' => 'events',
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => ($adjacent == 'next') ? 'ASC' : 'DESC',
'meta_query' => array(
array(
'key' => 'event_date',
'value' => $event_date,
'compare' => ($adjacent == 'next') ? '>' : '<',
'type' => 'DATE'
)
)
);
$adjacent_post = new WP_Query($args);
if ($adjacent_post->have_posts()) {
$adjacent_post->the_post();
return get_permalink();
}
return false;
}
Шаг 3: Использование функции навигации в шаблоне
Следующим шагом будет использование этой новой функции в вашем шаблоне для отображения ссылок на предыдущие и следующие посты:
<a href="<?php echo get_adjacent_event(false, 'prev'); ?>">Предыдущее событие</a>
<a href="<?php echo get_adjacent_event(false, 'next'); ?>">Следующее событие</a>
Зачем использовать данное решение?
- Гибкость: Вы можете изменять порядок событий в зависимости от даты, определенной в пользовательском поле ACF, а не от даты публикации постов.
- Контроль над показом контента: Это позволяет вам лучше контролировать пользовательский опыт, направляя пользователей к следующему или предыдущему событию согласно фактической дате события.
- Простота интеграции с Elementor: Используя данный код, вы можете легко интегрировать навигацию в любой элемент, созданный с помощью Elementor, или в своем собственном шаблоне.
Теперь вы можете использовать вышеуказанные решения для настройки навигации постов для вашего типа записи событий, обеспечивая удобный пользовательский интерфейс и корректный порядок отображения.