[Решено] Вывод таксономии произвольного типа записи с сортировкой по мета полю
Есть произвольный тип записи Мероприятия(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). Если оставить цикл без изменений, то нормально выводятся все записи, которые принадлежат именно данной категории. Но как только я задаю свои аргументы для цикла(чтобы происходила сортировка и т.д.), выводятся записи из всех категорий. Подскажите, пожалуйста, как организовать вывод?
В общем, решение, вроде бы, найдено.
Для файла 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 ); ?>