Пользовательский шаблон таксономии Список записей с порядком сортировки


У меня есть интересная проблема, которую я пытаюсь решить. Вот мои ситуации:

  • Я создал пользовательский тип записи для "событий".
  • Для каждой записи о событии мне требуются пользовательские поля для даты/времени начала события.
  • Кроме того, каждое событие может быть назначено пользовательской таксономии, которую я создал специально, чтобы назначить каждое событие одной или нескольким "категориям событий" (моя пользовательская таксономия).
  • Я создал общедоступный шаблон, который вызывает все сообщения относятся к этому пользовательскому типу сообщений, и я правильно фильтрую запрос, чтобы отображать ТОЛЬКО события, если дата начала/дата и время события превышают сегодняшнюю дату.
  • Все вышеперечисленное работает правильно.

Единственное, с чем у меня в настоящее время возникают проблемы, - это отображение всех событий для определенного термина таксономии.

Другими словами... вместе с каждым списком событий я включаю все термины, связанные с событием, из моей пользовательской таксономии (событие категории).

Итак, проблема здесь в том, что каждый термин таксономии (правильно) отображается в виде ссылки, но при выборе термина страница архива соответствующих терминов не упорядочивает соответствующие результаты по настраиваемому полю даты/времени события и не исключает события, которые старше сегодняшней даты.

На основе этой страницы: http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

Я выяснил, что можно создать пользовательскую страницу архива для всех терминов, принадлежащих пользовательской таксономии, назовите файл архива следующим образом:

Taxonomy-event_categories.php (где "категории событий") - это название моей пользовательской таксономии.

Тааак.... Как уже упоминалось, единственное, что, по моему мнению, мне нужно для решения, - это правильный код для вставки, чтобы решить две проблемы, упомянутые выше.

Вот код, который я использую, который работает для отображения моего списка событий, правильно организованного по дате/времени начала события, при удалении всех событий старше, чем сегодня.

<?php 
    //Get the metadata for each child page
    global $custom_metabox_event_dates;
    $meta1  = $custom_metabox_event_dates->the_meta();
       $today = time();
       $arrMonthNums = array("01" => "01", "02" => "02", "03" => "03", "04" => "04", "05" => "05", "06" => "06", "07" => "07", "08" => "08", "09" => "09", "10" => "10", "11" => "11", "12" => "12");
       $arrMonthNames = array("01" => "JANUARY", "02" => "FEBRUARY", "03" => "MARCH", "04" => "APRIL", "05" => "MAY", "06" => "JUNE", "07" => "JULY", "08" => "AUGUST", "09" => "SEPTEMBER", "10" => "OCTOBER", "11" => "NOVEMBER", "12" => "DECEMBER");
    query_posts('post_type=events&showposts=-1&meta_key=' . $custom_metabox_event_dates->get_the_name('combined_datetime') . '&meta_compare=>=&meta_value=' . $today . '&orderby=meta_value&order=ASC'); 
?>

  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <?php  //Get all Events and run a check against current date
    global $custom_metabox_event_dates; 
    global $custom_metabox_event_details; 
    $meta1          = $custom_metabox_event_dates->the_meta(); 
    $meta2          = $custom_metabox_event_details->the_meta();
    $meta_start_date    = $meta1['event_start_date'];
    $meta_end_date  = $meta1['event_end_date'];
    $meta_start_time    = $meta1['event_start_time'];
    $meta_end_time  = $meta1['event_end_time'];
    $meta_location_city = $meta2['event_location_city'];
    $meta_event_type    = $meta2['event_type'];
    $show_date      = strtotime($meta_start_date);
        if($show_date >= $today) { ?>
           <?php 
            $show_month = date('m', $show_date);
            if ($arrMonthNums[$show_month] == $show_month) {
            echo "<div id='category-events-list-month-title'>EVENTS IN ".$arrMonthNames[$show_month]."</div>"; 
            $arrMonthNums[$show_month] = "printed";
            }
        if($show_date == $today) { 
            ?>   
           <?php } ?>
    <div id="category-events-list-container-group">
                     <div id="category-events-list-container-left">
            <div id="event-entry-list-date"><?php echo $meta_start_date ?></div>
            <div id="event-entry-list-time"><?php echo $meta_start_time ?> - <?php echo $meta_end_time ?></div>
            </div>
            <div id="category-events-list-container-right">
        <div id="category-articles-list-title"><a href="<?php the_permalink() ?>"><?php echo the_title(); ?></a></div>
        <div id="category-articles-list-excerpt">
        <span>EVENT TYPE: <?php echo get_the_term_list($post->ID, 'event_types', '', ', ',''); ?> </span><br />
        <span>LOCATION: <?php echo $meta_location_city ?></span><br />
        <?php echo substr(get_the_excerpt(),0,250); echo '...  ' ?></div>
        </div>
            </div>
    <?php } ?>
<?php endwhile; endif; ?>

Пожалуйста, имейте в виду, что я не спрашиваю, как изменить запрос выше, чтобы он просто отображал сообщения на один срок... Скорее, мне каким-то образом нужно заставить страницу архива распознать, на какой термин был нажат, и, по сути, передать это через запрос вместе с упорядочиванием/фильтрацией, которые я делаю выше.

Я предполагаю, что это, вероятно, простой ответ, который включает в себя "цикл", который мне еще предстоит освоить.

ОБНОВЛЕНО

Вот код для страницы архива, которую необходимо изменить, чтобы при нажатии на термин из списка результатов выше отображались только те же результаты, но только для выбранного термина, отсортированного по дате/времени И исключающего любые события, предшествующие сегодняшней дате.

<?php if (have_posts()) : ?>
      <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
      <?php /* If this is a category archive */ if (is_category()) { ?>
        <div id="category-title-articles">Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</div>
      <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
        <div id="category-title-articles">Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</div>
      <?php } ?>
<?php while (have_posts()) : the_post(); ?>
<div id="category-articles-list-container-group">
</div>
<?php endwhile; ?>
<div class="navigation">
<div class="alignleft"><?php next_posts_link('&laquo; Older Entries') ?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries &raquo;') ?></div>
</div>
<?php else :
    if ( is_category() ) { // If this is a category archive
        printf("<h2 class='center'>Sorry, but there aren't any posts in the %s category yet.</h2>", single_cat_title('',false));
    } else if ( is_date() ) { // If this is a date archive
        echo("<h2>Sorry, but there aren't any posts with this date.</h2>");
    } else if ( is_author() ) { // If this is a category archive
        $userdata = get_userdatabylogin(get_query_var('author_name'));
        printf("<h2 class='center'>Sorry, but there aren't any posts by %s yet.</h2>", $userdata->display_name);
    } else {
        echo("<h2 class='center'>No posts found.</h2>");
    }
    get_search_form();
endif; ?>

Заранее благодарю,

Крис

Author: NetConstructor.com, 2010-11-02

1 answers

Наиболее эффективный способ, вероятно, состоит в том, чтобы подключиться к действию pre_get_posts и добавить туда свое сравнение времени. Таким образом, вам не нужно беспокоиться об остальных или параметрах запроса, так как они все равно будут работать. Он должен выглядеть следующим образом (непроверенный) и быть помещен в файл функций плагина или темы (не в файл шаблона страницы, запрос уже будет выполнен):

add_action('pre_get_posts', 'add_event_date_criteria');
function add_event_date_criteria(&$query)
{
    // We only want to filter on "public" pages
    // You can add other selections, like here:
    //  - Only on a term page for our custom taxonomy
    if (!is_admin() &&
        is_tax('event_types')) {
        global $custom_metabox_event_dates;
        $query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
        $query->set('meta_compare', '>=');
        $query->set('meta_value', time());
        $query->set('orderby', 'meta_value');
        $query->set('order', 'asc');
    }
}

Вы определяете область действия этого дополнительного фильтра с помощью содержимого теста if(). В настоящее время мы не делаем этого на страницы администратора (вы не сможете получить доступ к старому контенту), и делайте это только на определенных страницах таксономии. Вы должны сами выяснить, насколько широким или узким вы хотите это сделать.

Если вы не можете решить эту проблему таким образом, вы можете выполнить основной запрос снова, не теряя "запрос для конкретной страницы", добавив различные переменные запроса к основным объектам $wp_query и снова вызвав $wp_query->get_posts(). Поскольку мы не вызывали $wp_query->parse_query(), аргументы запроса для конкретной страницы не будут очищены. Это выглядело бы так это:

global $custom_metabox_event_dates;
$wp_query->set('meta_key', $custom_metabox_event_dates->get_the_name('combined_datetime'));
$wp_query->set('meta_compare', '>=');
$wp_query->set('meta_value', time());
$wp_query->set('orderby', 'meta_value');
$wp_query->set('order', 'asc');
$wp_query->get_posts();

Вы можете поместить это в файлы шаблонов (не functions.php, а taxonomy-event_types.php или другие "настоящие" файлы шаблонов). Помните, что вы "выбрасываете" один вызов базы данных таким образом, поэтому это не самое оптимальное решение.

 7
Author: Jan Fabry, 2010-11-05 22:52:21