короткий код заказа для пользовательского типа записи события

Вопрос или проблема

Ок, я работаю над веб-сайтом, используя тип записи событие с 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.

Оптимизация кода

Чтобы обеспечить корректное функционирование шорткода и улучшить его его читаемость, рассмотрим следующие рекомендации по улучшению вашего кода:

  1. Использование meta_value для точной сортировки:

    • Убедитесь, что значение метаданных event_start_date имеет одинаковый формат даты для всех записей (например, все даты должны быть в формате YYYY-MM-DD).
  2. Обработка ответа от WP_Query:

    • Убедитесь, что вам не нужно использовать wp_reset_query(), так как это может перезаписать глобальные переменные. Вместо этого используйте wp_reset_postdata().
  3. Улучшение обработки атрибутов шорткода:

    • Вместо extract() можно использовать метод с добавлением атрибутов напрямую в массив $atts.
  4. 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');

Заключение

Применив предложенные изменения, ваш шорткод теперь обеспечивает правильный порядок событий по дате начала, что является ключевым для лучшего пользовательского опыта. Кроме того, усовершенствования кода также могут повысить его эффективность и читаемость. Убедитесь, что все значения дат сохраняются и обрабатываются в требуемом формате, чтобы избежать проблем с сортировкой в будущем.

Оцените материал
Добавить комментарий

Капча загружается...