WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Вывод кастомного поста с проверкой произвольного поля (Турнир)

Есть 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(); ?>

Но не работает так, как мне хотелось. Он проверяет только последний добавленный турнир...

Была идея проставлять тэг турниру: "Текущий", "Ближайший" и "Прошедший". Но проблема в том, что можно забыть переставить тэг... Может можно сделать, чтобы вордпресс автоматически проставлял "Тэг" или "Статус" по проверке произвольного поля и текущей даты?

Подскажите, пожалуйста, куда копать, чтобы реализовать правильный вывод постов?

0
N1KLoD1sAN
2.4 года назад
  • 0
    stepan2278 www.weblancer.net/users/stepanko/?affili...
    <?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 ) {
    		// здесь вывод Ближайшего турнира
    	}
    }
    ?>
    N1KLoD1sAN 2.4 года назад

    Спасибо большое!
    В итоге сработало так:

    <?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(); ?>
    Комментировать
  • 0
    stepan2278 www.weblancer.net/users/stepanko/?affili...

    meta_query
    нужно использовать.
    Сейчас пишу код, но его не проверял. Главное, вы поймете идею.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация