Вопрос или проблема
У нас есть “мероприятия”, которые привязаны к конкретным датам, поэтому страница настроена так, чтобы сначала выводить мероприятия по дате события, а затем они должны сортироваться по времени проведения мероприятия.
С датами все в порядке — все нужные мероприятия находятся под соответствующими датами.
Но времена не всегда последовательны. Около 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>';
Пояснения:
-
Массив
orderby
: Использование массива позволяет указать несколько полей для сортировки. Сначала будет сортироваться по дате, а затем по времени (в данном случаеstart_time
). -
Параметр
meta_query
: Мы добавилиmeta_query
, чтобы контролировать выборку событий на основе года, и тем самым исключить события из других лет. -
Корректировка вывода даты: Дата теперь выводится только один раз для каждого уникального значения.
Итоги:
С таким решением все события будут правильно отсортированы по дате, а затем по времени в одном списке. Проверьте также формат хранения времени в базе данных, чтобы убедиться, что все времена хранятся в одном формате (24-часовой или 12-часовой с AM/PM) для корректной сортировки.
Это должно решить вашу проблему с неправильной сортировкой событий.