Вопрос или проблема
Ок, я работаю над веб-сайтом, используя тип записи событие с post_meta event_start_date, я создал шорткод, и все отображается нормально, кроме порядка отображения. Кажется, он не сортируется по meta_key или meta_value. Это страница http://mixedbagnext.com/wordpress/events/, вы заметите, что порядок дат неправильный, я хочу, чтобы самой недавней датой была первая, а остальные даты следовали за ней. К слову, я использую плагин More Fields для создания post_meta, который установлен на дату, введенную 2015-01-01. Вот мой код
// ШОРТКОД событие
function event_shortcode( $atts ) {
extract( shortcode_atts( array( 'limit' => -1, 'type' => 'event'), $atts ) );
$eventlist="";
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$carousel_query = new WP_Query(array (
'posts_per_page' => $limit,
'post_type' => $type,
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'meta_value_num',
'meta_key' => 'event_start_date',
'meta_query' => array(
// 'relation' => 'AND',
array(
'key' => 'event_start_date',
'value' => date('Y-m-d', strtotime('-6 hours')), //значение "дата заказа"
'compare' => '>=', //показать события, большие или равные сегодняшнему дню
'type' => 'CHAR'
)
),
'paged' => $paged ));
if ($carousel_query->have_posts()) :
$eventlist .= '<ul class="event-list clearfix">';
while ($carousel_query->have_posts()) : $carousel_query->the_post();
$event_artist = wp_strip_all_tags( get_the_term_list( get_the_ID(), 'artist_event', ' ', ' , ', ' ') );
$event_start_date = get_post_meta(get_the_ID(), 'event_start_date', true );
$fixed_date_day = strtotime($event_start_date);
$fixed_date_month = strtotime($event_start_date);
$event_start_time = get_post_meta(get_the_ID(), 'event_start_time', true );
$fixed_time_start = strtotime($event_start_time);
$event_end_date = get_post_meta(get_the_ID(), 'event_end_date', true );
$event_end_time = get_post_meta(get_the_ID(), 'event_end_time', true );
$fixed_time_end = strtotime($event_end_time);
$event_location = get_post_meta(get_the_ID(), 'event_location', true );
$event_address = get_post_meta(get_the_ID(), 'event_address', true );
$event_city = get_post_meta(get_the_ID(), 'event_city', true );
$event_state = get_post_meta(get_the_ID(), 'event_state', true );
$event_zipcode = get_post_meta(get_the_ID(), 'event_zipcode', true );
$event_telephone = get_post_meta(get_the_ID(), 'event_telephone', true );
$event_website = get_post_meta(get_the_ID(), 'event_website', true );
$event_description = get_post_meta(get_the_ID(), 'event_description', true );
$event_url = get_post_meta(get_the_ID(), 'event_url', true );
$event_button = get_post_meta(get_the_ID(), 'event_button', true );
$event_btn_img = get_post_meta(get_the_ID(), 'event_btn_img', true );
$event_price = get_post_meta(get_the_ID(), 'event_price', true );
$eventlist .= '<li id="event-list-'. get_the_ID() .'" class="' . implode(' ', get_post_class('clearfix')) . '" >'
.'<div class="event-list-date">'
.'<span class="event-list-day">'.date('d' , $fixed_date_day) .'</span>'
.'<span class="event-list-month">'.date('M' , $fixed_date_month) .'</span>'
.'</div>'
.'<div class="event-list-title">' . get_the_title() . '</div>'
.'<div class="event-list-time"><span class="yellow-text">время:</span>'.date('g:i A' , $fixed_time_start) .'</div>'
.'<div class="event-list-artist"><span class="yellow-text">с:</span>'.$event_artist.'</div>'
.'<div class="event-list-location"><span class="yellow-text">место:</span>'.$event_city.', '.$event_state.'</div>'
.'<div class="event-list-link"><a href="'.$event_url.'" target="_blank">подробности</a></div>'
.'</li>';
endwhile;
$eventlist .= '</ul>';
endif;
wp_reset_query();
return $eventlist;
}
add_shortcode( 'event', 'event_shortcode' ); // шорткод -> [event limit="5"]
Я все понял. Для тех, кто нуждается в решении, я отредактировал вышеуказанный код. Я изменил:
'order' => 'DESC'
на
'order' => 'ASC'
, и
'orderby' => 'meta_value_num'
на
'orderby' => 'meta_value'
чтобы достичь желаемого порядка.
Ответ или решение
Чтобы оптимально настроить порядок отображения событий в вашем настраиваемом типе постов "Событие" с использованием метаданных event_start_date
, вы правильно указали на необходимость изменения параметров order
и orderby
в вашем шорткоде. Рассмотрим более подробно и проанализируем ваш исходный код, чтобы понять, как добиться желаемого результата с наилучшей практикой.
Проблема и Исходный Код
Вы столкнулись с проблемой, когда события не сортируются по дате их начала. В вашем исходном запросе WP_Query
, вы использовали:
'order' => 'DESC',
'orderby' => 'meta_value_num',
Это условие не позволяло корректно отображать события в порядке возрастания (от самых недавних к более старым) по метаполям event_start_date
.
Решение
Согласно вашим последующим наблюдениям, решение проблемы заключалось в изменении порядка сортировки. Вот изменения, которые вы внедрили и которые являются правильными:
'order' => 'ASC',
'orderby' => 'meta_value',
Сортировка по ASC
(по возрастанию) будет обеспечивать отображение ближайших событий первыми. При этом использование meta_value
в качестве параметра сортировки позволит корректно обработать значения дат, так как они хранятся в формате Y-m-d
.
Оптимизация кода
Чтобы обеспечить корректное функционирование шорткода и улучшить его его читаемость, рассмотрим следующие рекомендации по улучшению вашего кода:
-
Использование
meta_value
для точной сортировки:- Убедитесь, что значение метаданных
event_start_date
имеет одинаковый формат даты для всех записей (например, все даты должны быть в форматеYYYY-MM-DD
).
- Убедитесь, что значение метаданных
-
Обработка ответа от WP_Query:
- Убедитесь, что вам не нужно использовать
wp_reset_query()
, так как это может перезаписать глобальные переменные. Вместо этого используйтеwp_reset_postdata()
.
- Убедитесь, что вам не нужно использовать
-
Улучшение обработки атрибутов шорткода:
- Вместо
extract()
можно использовать метод с добавлением атрибутов напрямую в массив$atts
.
- Вместо
-
SEO и разметка:
- Продумайте использование структурированных данных (например, Schema.org) для большинства данных о событиях, что улучшит SEO и видимость в поисковых системах.
Вот переработанный вариант вашего шорткода с вышеупомянутыми улучшениями:
// SHORTCODE event
function event_shortcode($atts) {
$atts = shortcode_atts(array(
'limit' => -1,
'type' => 'event',
), $atts);
$eventlist = "";
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$carousel_query = new WP_Query(array(
'posts_per_page' => $atts['limit'],
'post_type' => $atts['type'],
'post_status' => 'publish',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_key' => 'event_start_date',
'meta_query' => array(
array(
'key' => 'event_start_date',
'value' => date('Y-m-d', strtotime('-6 hours')),
'compare' => '>=',
'type' => 'DATE',
)
),
'paged' => $paged
));
if ($carousel_query->have_posts()) {
$eventlist .= '<ul class="event-list clearfix">';
while ($carousel_query->have_posts()) {
$carousel_query->the_post();
// Сбор метаданных
$event_start_date = get_post_meta(get_the_ID(), 'event_start_date', true);
$event_artist = wp_strip_all_tags(get_the_term_list(get_the_ID(), 'artist_event', ' ', ', ', ' '));
// Формирование HTML
$eventlist .= '<li id="event-list-' . get_the_ID() . '" class="' . implode(' ', get_post_class('clearfix')) . '">'
. '<div class="event-list-date">'
. '<span class="event-list-day">' . date('d', strtotime($event_start_date)) . '</span>'
. '<span class="event-list-month">' . date('M', strtotime($event_start_date)) . '</span>'
. '</div>'
. '<div class="event-list-title">' . get_the_title() . '</div>'
. '<div class="event-list-artist"><span class="yellow-text">with:</span>' . $event_artist . '</div>'
. '</li>';
}
$eventlist .= '</ul>';
}
wp_reset_postdata();
return $eventlist;
}
add_shortcode('event', 'event_shortcode');
Заключение
Применив предложенные изменения, ваш шорткод теперь обеспечивает правильный порядок событий по дате начала, что является ключевым для лучшего пользовательского опыта. Кроме того, усовершенствования кода также могут повысить его эффективность и читаемость. Убедитесь, что все значения дат сохраняются и обрабатываются в требуемом формате, чтобы избежать проблем с сортировкой в будущем.