Cómo ordenar CPT por valor meta personalizado (fecha), y devolver las publicaciones mes por mes

2

Para futuras referencias :
Estoy usando el excelente Meta Box Plugin para ayudar a acelerar la creación de meta box para mis tipos de publicaciones personalizadas.

Mi objetivo :
Para crear una sección de eventos altamente personalizable que se parezca mucho a un calendario tradicional como get_calendar crea, pero para un tipo de publicación personalizado específico.

El problema:
- Al confiar únicamente en el uso de Wordpress, construido en parámetros de tiempo , puedo devolver mis publicaciones en un orden ASC similar a un calendario tradicional pero estoy limitado a solo mostrar publicaciones hasta el día actual ya que no hay manera de consultar y devolver publicaciones programadas : este es un problema, obviamente, ya que necesito mostrar TODAS las publicaciones de eventos del mes actual, y en adelante ...
- Además, también necesito poder buscar en los meses "anteriores" y "próximos" similares a get_calendar .

Mi solución hasta ahora :
- Debido a las restricciones de los parámetros de tiempo, opté por devolver mis publicaciones a través del parámetro WP_Query ' meta_key en su lugar y lo asigné al campo "fecha de inicio" de mis eventos, y luego lo ordené - meta_value_num ...

Esto parece replicar la misma funcionalidad que busco en su mayor parte, pero ahora tengo un problema serio de:

  

"¿Cómo trato este valor meta como wordpresses los parámetros de tiempo nativos para poder almacenar estos datos de manera adecuada para cada mes y tener la opción de recorrer los meses de forma similar al archivo get_calendar?"

Espero que haya sido lo suficientemente definitiva en mi explicación para ayudar a cualquiera que lea esto a darle sentido a todo. Si no, hágamelo saber y con mucho gusto intentaré aclarar lo que sea ... ¡y gracias por la ayuda!

Pegado a continuación se encuentra mi plantilla actual "Calendario / Eventos", así como una captura de pantalla de la forma en que probablemente se verá en la parte delantera.

<?php
/*
Template Name: Calendar
*/
?>

<?php get_header(); ?>

<!-- featured_images.php -->
<?php include ('featured_images.php'); ?>

    <div id="full_col">

        <h2 class="feed_title_full"><?php wp_title('', true); ?></h2>
        <div id="calendar_nav">
            <h4 id="current_month"><?php the_time( 'F Y' ); ?></h4>
        </div>

        <ul id="calendar">

            <?php $current_year = date('Y'); // Get current YEAR ?> 
            <?php $current_month = date('m'); // Get current MONTH ?>
            <?php $calandar_posts = new WP_Query(
                array(
                    'post_type' => 'calendar', 
                    'year' => $current_year,
                    'monthnum' => $current_month, // Show ALL posts for current Month 
                    'meta_key' => 'epr_startdate',
                    'orderby' => 'meta_value_num',
                    'order' => 'ASC', 
                    'posts_per_page' => -1, 
                    'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
                )); 
            ?>
            <?php if($calandar_posts->have_posts()) : while($calandar_posts->have_posts()) : $calandar_posts->the_post(); ?>

                <li class="calendar_entry">
                    <a href="<?php the_permalink(); ?>" class="calendar_link" title="<?php the_title_attribute(); ?>"></a>
                    <div class="entry_date">
                        <?php echo get_post_meta($post->ID, 'epr_startdate', TRUE); ?>
                    </div>
                    <div class="shadow_overlay"></div>
                    <?php the_post_thumbnail('calendar-teaser', array('class' => 'calendar-teaser-img', 'alt' => 'View Event')); ?>
                </li>

            <?php endwhile; else: ?>
                <h2>No Events for the month of <?php the_time( 'F' ); ?></h2>
            <?php endif; ?>
            <?php wp_reset_query(); ?>

        </ul>

    </div>

<?php get_footer(); ?>

    
pregunta Mr.Brown 24.02.2013 - 08:04

1 respuesta

5

Esto no es un código completo para copiar / pegar, pero espero que sea lo suficientemente comprensible para que puedas comenzar.

El primer paso es registrar su tipo de publicación y agregar una regla de reescritura para manejar años / meses. Esto le dará eventos únicos en event/post-name/ , su archivo de tipo de publicación en calendar , y manejará las solicitudes entrantes para calendar/yyyy/mm/ . Asegúrate de visitar tu Configuración > La página de enlaces permanentes después de esto se agrega para eliminar las reglas de reescritura.

function wpa88173_calendar_post_type() {

    // just the important bits shown here
    $args = array(
        'rewrite' => array( 'slug' => 'event' )
        'has_archive' => 'calendar',
    );

    register_post_type( 'calendar', $args );

    add_rewrite_rule(
        '^calendar/([0-9]{4})/([0-9]{2})/?',
        'index.php?post_type=calendar&calendar_year=$matches[1]&calendar_month=$matches[2]',
        'top'
    );

}
add_action( 'init', 'wpa88173_calendar_post_type' );

El siguiente paso es agregar las vars de consulta calendar_year y calendar_month para que WordPress las agregue a la matriz de vars de consulta cuando se analizan las solicitudes entrantes.

function wpa88173_calendar_query_vars( $query_vars ) {
    $query_vars[] = 'calendar_year';
    $query_vars[] = 'calendar_month';
    return $query_vars;
}
add_filter('query_vars', 'wpa88173_calendar_query_vars' );

El siguiente paso es agregar una acción a pre_get_posts , que verifica si es el archivo de tipo de publicación del calendario, obtiene el año / mes o lo establece en el año / mes actual, luego modifica la consulta con los parámetros meta_query Para cargar el año / mes solicitado. Consulte WP_Query para obtener más información sobre las consultas meta. Esto supone un formato de fecha de yyyymmdd .

function wpa88173_calendar_query( $query ) {
    // is it a post type archive?
    if( ! $query->is_post_type_archive( 'calendar' ) )
        return;

    // is it the main query and not an admin page?      
    if( $query->is_main_query()
        && ! is_admin() ) {

        // check if year/month was set via the URI, or set it to current year/month
        ( ! empty( $query->query_vars['calendar_year'] ) ) ? $query_year = $query->query_vars['calendar_year'] : $query_year = date('Y');
        ( ! empty( $query->query_vars['calendar_month'] ) ) ? $query_month = $query->query_vars['calendar_month'] : $query_month = date('m');

        // meta_query parameters for events between start and end dates
        $date_start = $query_year . $query_month . '01';
        $date_end = $query_year . $query_month . '31';
        $meta_query = array(
            array(
                'key' => 'event_date',
                'value' => array( $date_start, $date_end ),
                'compare' => 'BETWEEN',
                'type' => 'NUMERIC'
            )
        );

        // modify the query
        $query->set( 'meta_key', 'event_date' );
        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', $meta_query );

    }

}
add_action( 'pre_get_posts', 'wpa88173_calendar_query' );

El último paso será para que usted cree el calendario en su plantilla y cree los enlaces siguientes / anteriores para recorrer los meses. Puede obtener el año / mes consultado en la plantilla a través de get_query_var .

EDIT : aquí hay un ejemplo de cómo construir los vínculos con matemáticas simples

( '' == get_query_var( 'calendar_month' ) ) ? $this_month = date( 'n' ) : $this_month = ltrim( get_query_var( 'calendar_month' ), '0' );
( '' == get_query_var( 'calendar_year' ) ) ? $this_year = date( 'Y' ) : $this_year = get_query_var( 'calendar_year' );

if( 1 == $this_month ):
    $next_month = 2;
    $prev_month = 12;
    $next_year = $this_year;
    $prev_year = $this_year - 1;
elseif( 12 == $this_month ):
    $next_month = 1;
    $prev_month = 11;
    $next_year = $this_year + 1;
    $prev_year = $this_year;
else:
    $next_month = $this_month + 1;
    $prev_month = $this_month - 1;
    $next_year = $this_year;
    $prev_year = $this_year;
endif;

$next_month = str_pad( $next_month , 2, '0', STR_PAD_LEFT );
$prev_month = str_pad( $prev_month , 2, '0', STR_PAD_LEFT );

echo 'next month: /calendar/' . $next_year . '/' . $next_month . '/';
echo 'previous month: /calendar/' . $prev_year . '/' . $prev_month . '/';
    
respondido por el Milo 25.02.2013 - 22:32

Lea otras preguntas en las etiquetas