ti-enxame.com

Modelo de taxonomia personalizada Lista de postagens com ordem de classificação

Eu tenho um problema interessante que estou tentando resolver. Aqui está a minha situação:

  • Eu criei um tipo de post personalizado para "eventos".
  • Para cada postagem de evento, eu preciso que os campos personalizados sejam inseridos para a data/hora de início do evento.
  • Além disso, cada evento pode ser atribuído a uma taxonomia personalizada que criei especificamente para atribuir cada evento a uma ou mais "categorias de evento" (minha taxonomia personalizada).
  • Eu criei um modelo público que chama todas as postagens que pertencem a este tipo de post personalizado e estou filtrando corretamente a consulta para SOMENTE eventos de exibição foram o início/data do evento e a hora é maior do que a data de hoje.
  • Todos os itens acima estão funcionando corretamente.

A única coisa que atualmente estou tendo problemas é exibir todos os eventos para um termo de taxonomia específico.

Em outras palavras ... juntamente com cada listagem de eventos, estou incluindo todos os termos associados ao evento da minha taxonomia personalizada (categorias de evento).

Portanto, há um problema aqui que cada termo de taxonomia (corretamente) aparece como um link, mas quando você seleciona o termo a página de arquivo de termos correspondente não está ordenando os resultados correspondentes pelo campo personalizado de data/hora do evento e não está excluindo eventos que são mais antigos do que a data de hoje.

Baseado nesta página: http://codex.wordpress.org/images/1/18/Template_Hierarchy.png

Eu descobri que é possível criar uma página de arquivo personalizada para todos os termos pertencentes a uma taxonomia personalizada, nomeando o arquivo como segue:

taxonomy-event_categories.php (onde "event_categories") é o nome da minha taxonomia personalizada.

Sooooooooo .... Como mencionado a única coisa que eu acredito que eu preciso de uma solução é o código correto para inserir para alcançar os dois problemas mencionados acima.

Aqui está o código que estou usando, que funciona em exibir minha lista de eventos organizada corretamente pela data/hora de início do evento, removendo todos os eventos anteriores a hoje.

<?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; ?>

Lembre-se de que não estou perguntando como alterar a consulta acima, para exibir apenas postagens de um termo ... Em vez disso, de alguma forma, preciso que a página de arquivamento reconheça qual termo foi clicado e passe isso pela consulta. com a ordenação/filtragem que estou fazendo acima.

Estou assumindo que esta é provavelmente uma resposta simples que envolve o "loop" que ainda tenho que dominar.

ATUALIZADO

Aqui está o código para a página de arquivo que precisa ser modificada para quando um termo for clicado da lista de resultados acima, para APENAS mostrar os mesmos resultados, mas somente para o termo selecionado E classificado por data/hora E eliminando quaisquer eventos anteriores a de hoje encontro.

<?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; ?>

Desde já, obrigado,

Chris

4
NetConstructor.com

A maneira mais eficiente é provavelmente conectar-se à ação pre_get_posts e adicionar sua comparação de tempo lá. Dessa forma, você não precisa se preocupar com o resto ou com as opções de consulta, pois elas ainda funcionarão. Ele deve se parecer com isso (não testado) e ser colocado em um arquivo de funções de plug-in ou de tema (não no arquivo de modelo de página, a consulta já terá sido executada):

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');
    }
}

Você define o escopo deste filtro extra com o conteúdo do teste if(). Atualmente, não fazemos isso nas páginas de administração (você não conseguiria acessar conteúdo antigo) e só o fazemos em páginas de taxonomia específicas. Você deve descobrir por si mesmo o quão largo ou estreito você quer isso.

Se você não puder resolvê-lo dessa maneira, poderá fazer a consulta principal novamente sem perder a "consulta específica da página", adicionando as diferentes consultas vars aos objetos $wp_query principais e chamando $wp_query->get_posts() novamente. Como não chamamos $wp_query->parse_query(), os argumentos de consulta específicos da página não serão limpos. Ficaria assim:

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();

Você pode colocar isso em seus arquivos de modelo (não functions.php, mas taxonomy-event_types.php ou outros arquivos de modelo "reais"). Lembre-se de que você "descarta" uma chamada de banco de dados dessa maneira, por isso não é a solução mais ideal.

7
Jan Fabry