Сортировать по дате, затем по времени

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

У нас есть “мероприятия”, которые привязаны к конкретным датам, поэтому страница настроена так, чтобы сначала выводить мероприятия по дате события, а затем они должны сортироваться по времени проведения мероприятия.

С датами все в порядке — все нужные мероприятия находятся под соответствующими датами.

Но времена не всегда последовательны. Около 80% из них верные, но время от времени одно из мероприятий оказывается не на месте… поэтому я могу увидеть что-то похожее на это: (ДЕНЬ 2 показывает проблему)

ДЕНЬ 1
 8:00 - 10:00 мероприятие 1
10:15 - 12:00 мероприятие 2
 1:15 -  2:00 мероприятие 3
 3:15 -  5:00 мероприятие 4

ДЕНЬ 2
 8:00 - 10:00 мероприятие 1
 3:15 -  5:00 мероприятие 4
10:15 - 12:00 мероприятие 2
 1:15 -  2:00 мероприятие 3

Это код, который обрабатывает эту часть — может кто-нибудь предложить совет, как упорядочить ВРЕМЕНА в порядке возрастания?

echo '<div class="page hentry entry"><div class="entry"><ul class="conference_list">';
$year_to_show = '2016';

$args = array(
    'posts_per_page' => -1, 
    'meta_key'       => 'date', 
    'order'          => 'ASC', 
    'orderby'        => 'meta_value',
    'post_type'      => 'proposal'
);
$myQuery = new WP_Query( $args );

$date = CFS()->get( 'date' ); 

if ( $myQuery->have_posts() ) : while ( $myQuery->have_posts() ) : $myQuery->the_post();
    if ( date( 'Y', strtotime( CFS()->get( 'date' ) ) ) == $year_to_show ) {
        if ( $date != CFS()->get( 'date' ) ) {
            $date = CFS()->get( 'date' );
            echo '<div class="date_title">';
            echo date( 'F j, Y', strtotime( CFS()->get( 'date' ) ) );
            echo '</div>';
        } ?>
        <li><span><?php echo genesis_get_custom_field( 'start_time' ); ?>  - <?php 
            echo genesis_get_custom_field( 'end_time' );?>   </span>

Вы можете упорядочивать по нескольким критериям, смотрите больше на https://make.wordpress.org/core/2014/08/29/a-more-powerful-order-by-in-wordpress-4-0/:

$args = array(
    'meta_key' => 'start_time',
    'orderby' => array('date' => 'ASC', 'meta_value' => 'ASC)
);

Ответ или решение

Чтобы правильно отсортировать события сначала по дате, а затем по времени, необходимо внести изменения в ваш код, используя параметры сортировки в WP_Query. Ваша текущая конфигурация позволяет сортировать только по одной мета-параметру, что может привести к несоответствиям при отображении времени событий.

Вместо этого вы можете использовать массив для параметра orderby, указывающий, что нужно сначала сортировать по дате, а затем по времени. Вот как вы можете изменить ваш код:

echo '<div class="page hentry entry"><div class="entry"><ul class="conference_list">';
$year_to_show = '2016';

$args = array(
    'posts_per_page' => -1, 
    'meta_query'     => array(
        'relation' => 'AND',
        array(
            'key'     => 'date',
            'value'   => $year_to_show,
            'compare' => 'LIKE'
        )
    ),
    'orderby'        => array(
        'date' => 'ASC',
        'start_time' => 'ASC',
    ),
    'order'          => 'ASC',
    'post_type'      => 'proposal'
);

$myQuery = new WP_Query($args);

$date = '';

if ($myQuery->have_posts()) : 
    while ($myQuery->have_posts()) : 
        $myQuery->the_post();

        $current_date = CFS()->get('date'); // Получаем текущую дату события
        if ($date != $current_date) {
            $date = $current_date;
            echo '<div class="date_title">';
            echo date('F j, Y', strtotime($current_date));
            echo '</div>';
        }
        ?>
        <li>
            <span>
                <?php echo genesis_get_custom_field('start_time'); ?> - <?php echo genesis_get_custom_field('end_time'); ?>
            </span>
            <?php the_title(); ?> <!-- Вы можете добавить название события -->
        </li>
        <?php
    endwhile; 
endif;

echo '</ul></div></div>';

Пояснения:

  1. Массив orderby: Использование массива позволяет указать несколько полей для сортировки. Сначала будет сортироваться по дате, а затем по времени (в данном случае start_time).

  2. Параметр meta_query: Мы добавили meta_query, чтобы контролировать выборку событий на основе года, и тем самым исключить события из других лет.

  3. Корректировка вывода даты: Дата теперь выводится только один раз для каждого уникального значения.

Итоги:

С таким решением все события будут правильно отсортированы по дате, а затем по времени в одном списке. Проверьте также формат хранения времени в базе данных, чтобы убедиться, что все времена хранятся в одном формате (24-часовой или 12-часовой с AM/PM) для корректной сортировки.

Это должно решить вашу проблему с неправильной сортировкой событий.

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

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