Arquivos para o tipo de postagem personalizado com base em um valor meta de "data"

4

Eu tenho um tipo de postagem personalizado "Evento". Cada postagem tem um meta-campo para a data real do evento, que não pode ser a data de publicação das postagens, pois a maioria das datas dos eventos será no futuro.

Com isso, estou tentando criar um arquivo (ano e mês) para eventos passados e futuros com base no campo meta. Só não consigo entender como criar uma consulta para isso e exibi-la como url.com/post-type/2011/01

O valor de data do meta campo é definido como AAAA-MM-DD.

Qualquer ajuda com este é muito apreciada! Obrigado.

    
por Ryan Palmer 26.01.2012 / 03:18

2 respostas

4

Eu fiz algo semelhante para um cliente há algum tempo, vou dar-lhe um pouco do código aqui, pois é possível adaptar-se às suas necessidades. Eu vou te avisar, é um pouco para analisar!

Primeiro, eu configurei algumas regras de reconfiguração personalizadas para obter a estrutura de URL do ano / mês e algumas consultas para passar o ano e o mês para o meu modelo. Neste exemplo, tenho uma página configurada com o slug event-calendar que uso como minha lista de eventos / página de archive. Este código iria em functions.php :

<?php
add_action( 'init', 'wpse_rewrites_init' );
function wpse_rewrites_init(){
    // after adding, visit settings > permalinks to flush rewrite rules!
    add_rewrite_rule(
        'event-calendar/([0-9]+)/([0-9]+)/?$',
        'index.php?pagename=event-calendar&wpse_year=$matches[1]&wpse_month=$matches[2]',
        'top' );
    add_rewrite_rule(
        'event-calendar/([0-9]+)/?$',
        'index.php?pagename=event-calendar&wpse_year=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse_query_vars' );
function wpse_query_vars( $query_vars ){
    $query_vars[] = 'wpse_year';
    $query_vars[] = 'wpse_month';
    return $query_vars;
}

Este é o código no meu modelo page-event-calendar.php para consultar eventos com base no ano e mês (se estiver definido), caso contrário, mostrarei os próximos eventos:

<?php
// default args, upcoming events
$args = array(
    'posts_per_page' => -1,
    'meta_key' => 'event_date',
    'meta_value' => date('Y-m-d'),
    'meta_compare' => '>=',
    'orderby' => 'meta_value',
    'order' => 'ASC'            
);

// get the year and month query vars
$wpse_year = get_query_var('wpse_year');
$wpse_month = get_query_var('wpse_month');

// if a month was set we query for the requested month/year (we assume year is set if month is)
if($wpse_month):
    $estart = $wpse_year.'-'.$wpse_month.'-01';
    $eend = $wpse_year.'-'.$wpse_month.'-31';
    $args = array(
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'event_date',
                'value' => array( $estart, $eend ),
                'compare' => 'BETWEEN',
                'type' => 'date',
            )
        ),
        'orderby' => 'meta_value',
        'order' => 'ASC'
    );
endif;

// if just a year is set, we query for the requested year
if($wpse_year&&!$wpse_month):
    $estart = $wpse_year.'-01-01';
    $eend = $wpse_year.'-12-31';
    $args = array(
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'event_date',
                'value' => array( $estart, $eend ),
                'compare' => 'BETWEEN',
                'type' => 'date',
            )
        ),
        'orderby' => 'meta_value',
        'order' => 'ASC'
    );
endif;

// query for our events
$events = new WP_Query($args);
while($events->have_posts()) : $events->the_post();
    // do your normal loop stuff here
endwhile;

Para gerar uma lista de archive de anos / meses para meus eventos passados, faço alguns SQL personalizados para obter todos os meta valores exclusivos para a chave event_date . É mais rápido do que fazer uma junção com as postagens reais, mas a desvantagem é que você obterá valores meta para postagens possivelmente não publicadas. Isso foi ok para as necessidades do meu cliente, mas possivelmente não o seu.

$query = "SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = 'event_date' AND DATE(meta_value) < DATE(NOW()) ORDER BY meta_value DESC";
$all_unique_dates = $wpdb->get_results($query);

Você pode remover a condição AND DATE(meta_value) < DATE(NOW() se desejar também eventos futuros na lista.

ok, é isso! Espero que você ache isso útil.

    
por Milo 26.01.2012 / 04:37
0

A exibição do seu URL não funcionará assim, infelizmente ... não sem uma boa quantidade de sapata pelo menos.

Aqui está a parte da consulta que você precisa, isso não foi testado, mas deve funcionar. No pior caso, você pode armazenar dados de eventos como um registro de data e hora unix e converter de volta quando você for exibir.

$args = array(
    'post_type'  => 'event',
    'meta_query' => array(
        'key'     => 'date',
        'value'   => array( 'date_1', 'date 2' ), // try formatting these as dates and see if it works, if not, Unix timestamps will do just fine
        'compare' => 'BETWEEN'
    )
);
$posts = new WP_Query( $args );

Você pode fazer os URLs de uma maneira menos bonita e ter example.com/post_type/?month=february com bastante facilidade. Espero que isso ajude alguns.

    
por mor7ifer 26.01.2012 / 03:38