WordPress как на ладони
WordPress темы и плагины за 250 рублей wordpress jino

[Решено] Вывод таксономии произвольного типа записи с сортировкой по мета полю

Есть произвольный тип записи Мероприятия(event), есть таксономия Категории мероприятий(event-categories). При создании мероприятия задаются Дата начала мероприятия(event_start_date), Дата окончания(event_end_date) мероприятия и Дата снятия поста с публикации(event_expire_date). Зарегистрированы запись и таксономия следующим образом:

    // Категории мероприятий
	$labels = array(
		'name'                       => _x( 'Категория Мероприятий', 'Taxonomy General Name', 'techacademy' ),
		'singular_name'              => _x( 'Категории Мероприятий', 'Taxonomy Singular Name', 'techacademy' ),
		'menu_name'                  => __( 'Категории мероприятий', 'techacademy' ),
		'all_items'                  => __( 'Категории мероприятий', 'techacademy' ),
		'parent_item'                => __( 'Родительская категория мероприятий', 'techacademy' ),
		'parent_item_colon'          => __( 'Родительская категория мероприятий:', 'techacademy' ),
		'new_item_name'              => __( 'Новая Категория Мероприятий', 'techacademy' ),
		'add_new_item'               => __( 'Добавить Категорию Мероприятий', 'techacademy' ),
		'edit_item'                  => __( 'Редактировать Категорию Мероприятий', 'techacademy' ),
		'update_item'                => __( 'Обновить Категорию Мероприятий', 'techacademy' ),
		'separate_items_with_commas' => __( 'Разделяйте отдельные категории запятыми', 'techacademy' ),
		'search_items'               => __( 'Найти Категорию Мероприятий', 'techacademy' ),
		'add_or_remove_items'        => __( 'Добавить или удалить Добавить Категорию Мероприятий', 'techacademy' ),
		'choose_from_most_used'      => __( 'Выберете Популярные Категории Мероприятий', 'techacademy' ),
		'not_found'                  => __( 'Не найдено', 'techacademy' ),
	);
	$args = array(
		'labels'                     => $labels,
		'hierarchical'               => true,
		'public'                     => true,
		'show_ui'                    => true,
		'show_admin_column'          => true,
		'show_in_menu'               => true,
		'show_in_nav_menus'          => true,
		'show_tagcloud'              => true,
		'show_in_quick_edit'         => true,
		'meta_box_cb'                => null,
		'show_admin_column'          => true,
		'description'                => '',
		'update_count_callback'      => '',
		'query_var'                  => true,
		'rewrite' => array(
			'slug' => 'event-categories',
			'with_front' => false,
			'hierarchical' => true,
			'ep_mask' => EP_NONE,
		),
		'sort' => null,
		'_builtin' => false,

	);
	register_taxonomy( 'event-categories', array( 'event' ), $args );

	//Мероприятия
	$labels = array(
		'name'                => _x( 'Мероприятия', 'Post Type General Name', 'techacademy' ),
		'singular_name'       => _x( 'Мероприятие', 'Post Type Singular Name', 'techacademy' ),
		'menu_name'           => __( 'Мероприятия', 'techacademy' ),
		'parent_item_colon'   => __( 'Родительское мероприятие', 'techacademy' ),
		'all_items'           => __( 'Все мероприятия', 'techacademy' ),
		'view_item'           => __( 'Просмотреть мероприятие', 'techacademy' ),
		'add_new_item'        => __( 'Добавить новое мероприятие', 'techacademy' ),
		'add_new'             => __( 'Добавить новое', 'techacademy' ),
		'edit_item'           => __( 'Редактировать мероприятие', 'techacademy' ),
		'update_item'         => __( 'Обновить мероприятие', 'techacademy' ),
		'search_items'        => __( 'Найти мероприятие', 'techacademy' ),
		'not_found'           => __( 'Мероприятие не найдено', 'techacademy' ),
		'not_found_in_trash'  => __( 'Не найдено ни одного мероприятия в корзине', 'techacademy' ),
	);  
	$args = array(
		'label'               => __( 'event', 'techacademy' ),
		'description'         => __( 'Список предстоящих Мероприятий', 'techacademy' ),
		'labels'              => $labels,
		'supports'            => array( 'title', 'editor', 'thumbnail' ),
		'taxonomies'          => array('event-categories'),
		'hierarchical'        => false,
		'public'              => true,
		'show_ui'             => true,
		'show_in_menu'        => true,
		'show_in_nav_menus'   => true,
		'show_in_admin_bar'   => true,
		'menu_position'       => 5,
		'menu_icon'           => 'dashicons-calendar',
		'can_export'          => true,
		'has_archive'         => true,
		'exclude_from_search' => false,
		'publicly_queryable'  => true,
		'capability_type'     => 'post',
	);
	register_post_type( 'event', $args );

Есть файл вывода записей archive-event.php:

<?php
/**
 * Template Name: Мероприятия
 *
 * @package Techacademy
 */
get_header(); ?>
<div class="motopress-wrapper content-holder clearfix">
	<div class="container">
		<div class="row">
			<div class="span12" data-motopress-wrapper-file="event.php" data-motopress-wrapper-type="content">
				<div class="row">
					<div class="span12" data-motopress-type="static" data-motopress-static-file="static/static-title.php">
						<?php get_template_part('static/static-title'); ?>
						<section class="title-section">
							<ul class="breadcrumb breadcrumb__t">
								<li><a href="<?php $url = home_url(); echo $url; ?>">Главная</a></li>
								<li class="divider"></li>
								<li class="active">Мероприятия</li>
							</ul>
							<div class="clear"></div>
							<h1 class="title-header"><?php the_title();?></h1>    
						</section><!-- .title-section -->
					</div>
				</div>
				<div class="row">
					<div class="span12" data-motopress-type="loop" data-motopress-loop-file="loop/loop-event.php">                                            
						<div id="ajax" class="bricks-wrapper">
							<?php get_template_part('loop/loop-event'); ?>
						</div>                    
					</div>
				</div><!-- .row (end) -->           
				<div class="spacer"></div>          
			</div>
		</div>
	</div>
</div>
<?php get_footer(); ?>

И собственно loop-event.php:

<?php /* Loop Name: Event */ ?>
<?php 
	// Вводим свои значения
	$event_expire_date = get_post_meta($post->ID, 'event_expire_date', true);
	// Текущая дата
	$date_today = date('Y-m-d');
	// Если дата снятия с публикации = сегодняшней дате, то прибавляем к текущей дате один день, чтобы исключить эти посты
	if ($event_expire_date = $date_today) {
		$today = date('Y-m-d', strtotime($date_today) + 86400);
	} else {
		$today = $date_today;
	}
	// Текущая дата + 6 месяцев
	$date = date('Y-m-d', strtotime('+6 month'));
	$args = array(
		'post_type' => 'event', 
		'post_status' => 'publish', 
		// Выводим по произвольному полю
		'meta_key'  => 'event_start_date',
		'orderby'   => 'meta_value',    
		'order'     => 'DESC',
		'meta_query'=> array(
			 'key' => 'event_expire_date',
			 // Сравниваем значения двух дат
			 'value' => array($today,$date),
			 // Обозначаем, что будет дата, формат ГодМесяцДень
			 'type' => 'DATE',
			 // Сравниваем две даты, пример вывода: array('20500401','20500405') 
			 'compare' => 'BETWEEN',
			 // Сравниваем, что не пустое. Если пустое - то не выводим.
			 'meta_compare' => '!='
		)    
	);
	if ( is_home() || is_front_page() ) {
		$sec_args = array ('posts_per_page' => 3);
	} else { $sec_args = array ('posts_per_page' => -1); }

	$event = new WP_Query(array_merge($args,$sec_args));
?>

<?php if ( $event->have_posts() ) : ?>
	<?php while ( $event->have_posts() ) : $event->the_post(); ?>
		<div id="post-<?php the_ID(); ?>" <?php post_class('bricks'); ?>>
			<div class="bricks-inner">
				<a href="<?php the_permalink(); ?>" rel="bookmark">
					<?php if ( has_post_thumbnail() ) : ?>
						<?php the_post_thumbnail( 'news-bricks' ); ?>
					<?php else : ?>
						<!-- img src="<!-- ?php bloginfo('template_directory'); ?>/images/zaglushka-500-500.png" alt="<!-- ?php the_title(); ?>" / -->
						<img width="424" height="424" src="<?php $blog_img = get_theme_mod('blog_img'); echo $blog_img; ?>" alt="<?php the_title(); ?>" />
					<?php endif; ?>
					<span class="date start">
						<?php
						$event_start_date = get_post_meta($post->ID, 'event_start_date', true);
						$event_start_date_modified = date_i18n( 'd F Y', strtotime( $event_start_date ), 1 );               
						$start_date = explode(" ", $event_start_date_modified);
						$start_day = $start_date[0];
						$start_month = $start_date[1];
						$start_year = $start_date[2];
						echo '<span style="color:#fff; font-size: 24px;">с</span> <span class="time time_d">'.$start_day.'</span><span class="time time_m">'.$start_month.'<br/>'.$start_year.'</span>';
						?>
					</span>
					<span class="date end">
						<?php
						$event_end_date = get_post_meta($post->ID, 'event_end_date', true);
						$event_end_date_modified = date_i18n( 'd F Y', strtotime( $event_end_date ), 1 );   
						$end_date = explode(" ", $event_end_date_modified);
						$end_day = $end_date[0];
						$end_month = $end_date[1];
						$end_year = $end_date[2];
						echo '<span style="color:#fff; font-size: 24px;">по</span> <span class="time time_d">'.$end_day.'</span><span class="time time_m">'.$end_month.'<br/>'.$end_year.'</span>';
						?>
					</span>
					<span class="category-section"><?php
						$categories = get_the_terms($post->ID, 'event-categories');
						foreach ($categories as $category) {
							echo $category->name;
						} ?>
					</span>
					<span class="title-wrapper"><?php the_title(); ?></span>
					<span class="more-link">Подробнее</span>
				</a>
			</div>
		</div>

	<?php endwhile; ?>
<?php else : ?>
	<p><?php _e( 'Извините, пока предстоящих мероприятий нет.', 'techacademy' ); ?></p>
<?php endif; ?>
<?php wp_reset_postdata(); ?>

Как видно из аргументов цикла, я вывожу мероприятия, отсортированные по дате начала мероприятия, и те, у которых дата снятия поста с публикации находится между текущей датой и текущей датой + 6 месяцев. На главной странице и на странице мероприятий всё работает отлично.

Есть файл taxonomy-event-categories.php, который по идее должен отвечать за вывод категорий (типа домен/event-categories/seminars). Если оставить цикл без изменений, то нормально выводятся все записи, которые принадлежат именно данной категории. Но как только я задаю свои аргументы для цикла(чтобы происходила сортировка и т.д.), выводятся записи из всех категорий. Подскажите, пожалуйста, как организовать вывод?

Заметки к вопросу:
OLD_Grays 3 дня назад

В общем, решение, вроде бы, найдено.
Для файла taxonomy-event-categories.php цикл дополнил параметрами таксономий tax_query и всё заработало. Мероприятия отсортированы по мета полю Дата начала и выводятся только те мероприятия, у которых Дата снятия с публикации между текущей и текущей + 6 месяцев.
Цикл выглядит так:

<?php /* Loop Name: Event Category */

$event_expire_date = get_post_meta($post->ID, 'event_expire_date', true);
$date_today = date('Y-m-d');
// Если дата снятия с публикации = сегодняшней дате, то прибавляем к текущей дате один день, чтобы исключить эти посты
if ($event_expire_date = $date_today) {
	$today = date('Y-m-d', strtotime($date_today) + 86400);
} else {
	$today = $date_today;
}
$date = date('Y-m-d', strtotime('+6 month'));

// Получаем элементы таксономий и добавляем в аргументы цикла параметры таксономий
$cur_terms = get_the_terms( $post->ID, 'event-categories' );
foreach( $cur_terms as $cur_term ){
	$taxonomy = $cur_term->taxonomy;
	$taxonomy_ID = $cur_term->term_id;
	$taxonomy_slug = $cur_term->slug;
	$args = array(
		'post_type' => 'event',
		'posts_per_page' => -1,
		'meta_key'  => 'event_start_date',
		'orderby'   => 'meta_value',    
		'order'     => 'DESC',
		'meta_query'=> array(
			 'key' => 'event_expire_date',
			 'value' => array($today,$date),
			 'type' => 'DATE',
			 'compare' => 'BETWEEN',
			 'meta_compare' => '!='
		),
		'tax_query' => array(
			array(
				'taxonomy' => $taxonomy,
				'field'    => 'slug',
				'terms'    => $taxonomy_slug
			)
		)
	);
}
$query = new WP_Query( $args );
?>
0
4 дня назад

Нет ответов на этот вопрос.

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