Вывод кастомного поста с проверкой произвольного поля (Турнир)
Есть custom post type "Турнир". В нём завёл несколько турниров.
У каждого турнира есть два произвольных поля: data_start (начало турнира) и data_end (конец турнира).
Хочу выводить один "текущий" турнир, у которого сегодняшняя дата в пределах начала-конца турнира. Если такого турнира нет, то выводить "ближайший" будующий турнир. Иначе не выводить ничего.
Как это сделать?
Сделал пока так:
<?php global $post; $post_count = 0; $myposts = get_posts([
'numberposts' => 1, /* выведем только один пост */
'post_type' => 'tournaments' /* тип поста Турнир */
]); ?>
<?php if( $myposts ): ?>
<?php foreach( $myposts as $post ): ?>
<?php
$date_1 = date("d.m.Y"); /* Текущая дата */
$date_2 = get_field('data_start'); /* Дата начала турнира */
$date_3 = get_field('data_end'); /* Дата окончания турнира */
$date_timestamp_1 = strtotime($date_1); /* Приводим строку к дате */
$date_timestamp_2 = strtotime($date_2); /* Приводим строку к дате */
$date_timestamp_3 = strtotime($date_3); /* Приводим строку к дате */
?>
<?php if ($date_timestamp_1 >= $date_timestamp_2 && $date_timestamp_1 <= $date_timestamp_3): ?>
<div>Текущий турнир</div>
<?php elseif ($date_timestamp_2 > $date_timestamp_1): ?>
<div>Ближайший турнир</div>
<?php else: ?>
<div>Турниров нет</div>
<?php endif; ?>
<?php endforeach; ?>
<?php endif; ?>
<?php wp_reset_postdata(); ?>
Но не работает так, как мне хотелось. Он проверяет только последний добавленный турнир...
Была идея проставлять тэг турниру: "Текущий", "Ближайший" и "Прошедший". Но проблема в том, что можно забыть переставить тэг... Может можно сделать, чтобы вордпресс автоматически проставлял "Тэг" или "Статус" по проверке произвольного поля и текущей даты?
Подскажите, пожалуйста, куда копать, чтобы реализовать правильный вывод постов?
<?php global $post; $post_count = 0; $myposts_current = get_posts([ 'numberposts' => 1, /* выведем только один пост */ 'post_type' => 'tournaments' /* тип поста Турнир */ 'meta_query' => [ [ 'key' => 'data_start', 'value' => date('Ymd'), // именно в таком формате хран дата от ACF 'compare' => '>=', 'type' => 'NUMERIC', ], [ 'key' => 'data_end', 'value' => date('Ymd'), // именно в таком формате хран дата от ACF 'compare' => '<=', 'type' => 'NUMERIC', ], ] ]); if ( $myposts_current ) { // здесь вывод Текущего турнира } else { $date_next = date('Ymd', strtotime('+1 days')); $myposts_next = get_posts([ 'numberposts' => 1, /* выведем только один пост */ 'post_type' => 'tournaments' /* тип поста Турнир */ 'meta_query' => [ [ 'key' => 'data_start', 'value' => $date_next, 'compare' => '>=', 'type' => 'NUMERIC', ], [ 'key' => 'data_end', 'value' => $date_next, 'compare' => '<=', 'type' => 'NUMERIC', ], ] ]); if ( $myposts_next ) { // здесь вывод Ближайшего турнира } } ?>Спасибо большое!
В итоге сработало так:
<?php global $post; $post_count = 0; $myposts_current = get_posts([ 'numberposts' => 1, 'post_type' => 'tournaments', 'meta_query' => [ [ 'key' => 'data_start', 'value' => date('Ymd'), 'compare' => '<=', 'type' => 'DATE' ], [ 'key' => 'data_end', 'value' => date('Ymd'), 'compare' => '>=', 'type' => 'DATE' ], ] ]); ?> <?php if ( $myposts_current ) { ?> <?php foreach( $myposts_current as $post ) { ?> // текущий турнир <?php } ?> <?php } else { $myposts_next = get_posts([ 'numberposts' => 1, 'post_type' => 'tournaments', 'meta_query' => [ [ 'key' => 'data_start', 'value' => date('Ymd'), 'compare' => '>=', 'type' => 'DATE' ] ] ]); ?> <?php if ( $myposts_next ) { ?> <?php foreach( $myposts_next as $post ) { ?> // ближайший турнир <?php } ?> <?php } else { ?> // турниров нет <?php } } ?> <?php wp_reset_postdata(); ?>meta_query
нужно использовать.
Сейчас пишу код, но его не проверял. Главное, вы поймете идею.