[Решено] Вывод таксономии произвольного типа записи с сортировкой по мета полю
Есть произвольный тип записи Мероприятия(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 месяцев.
Цикл выглядит так: