¿Cómo buscar eventos entre dos fechas establecidas en WordPress?

28 nov 2011, 05:09:09
Vistas: 33.5K
Votos: 4

Estoy construyendo un sitio en WordPress con una función de eventos. La página de eventos fue creada con tipos de contenido personalizados (custom post types).

Quiero hacer posible que las personas puedan buscar/filtrar eventos por fechas. Por ejemplo, que puedan buscar todos los eventos que ocurren entre el 2 de diciembre de 2011 y el 1 de marzo de 2012 y obtener resultados de eventos que tienen sus fechas entre los meses de diciembre y marzo (es decir, diciembre, enero, febrero y marzo).

Quiero saber la mejor manera de hacer esto. ¿Alguna idea?

Puedes ver un ejemplo de lo que quiero lograr mirando la función "Search events by date" en esta página http://www.londontown.com/events

Si eso no fuera posible, ¿hay alguna manera de que puedan buscar eventos que ocurran entre ciertos meses, digamos diciembre y febrero (excluyendo los días)?

Gracias de antemano.

0
Todas las respuestas a la pregunta 2
2
11

Hay dos cosas que necesitas hacer para lograr esto:

1) Crear metadatos para los datos de cada evento

2) Consultar las publicaciones usando meta_query

Para el punto #1, necesitas añadir una metabox que permita al usuario agregar una fecha para el evento. Estos datos deben almacenarse como metadatos usando add_post_meta o update_post_meta. Te recomiendo que leas sobre cómo agregar metadatos si no estás familiarizado con el proceso:

http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/

Para el punto #2, asumiendo que has guardado los valores de fecha en un formato ordenable (ej. YYYY-MM-DD), puedes usar el parámetro meta_query dentro de una nueva instancia de WP_Query para obtener el rango de fechas apropiado. Este método asume que tu meta_key es "_my-datetime-from". Por ejemplo, puedes obtener las publicaciones de octubre y noviembre de 2011 con lo siguiente:

// Establecer argumentos para eventos  
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
    'post_type' => 'my-event-type',
    'posts_per_page' => -1,
    'orderby' => 'meta_value', 
    'order' => 'ASC',
    'meta_key' => '_my-datetime-from',
    'meta_query' => array(
        array(
            'key' => '_my-datetime-from',
            'value' => array($start, $end),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        )
    )
);
// Hacer la consulta
$events_query = new WP_query();
$events_query->query($args);
28 nov 2011 05:50:33
Comentarios

Vale. Entiendo, pero ¿cómo lo añado al formulario de búsqueda para no tener que introducir las fechas manualmente en el código? Debe integrarse en el formulario de búsqueda para que los usuarios puedan obtener eventos seleccionando fechas. Gracias.

Sosthenes Kwame Boame Sosthenes Kwame Boame
29 nov 2011 04:13:44

Vale, creo que estoy cerca. Ahora tengo esto en mi archivo search.php http://www.pastebin.com/zMRwRihz y esto es lo que hay en mi formulario de búsqueda: http://www.pastebin.com/nZePhPHV Estoy usando jquery ui datepicker para seleccionar las fechas en el frontend (campo de búsqueda por fecha). Esto es lo que obtengo en la URL después de enviar una búsqueda: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%‌​2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Aún así, no se devuelven resultados. ¿Alguna pista sobre qué está impidiendo que se muestren las publicaciones? Gracias.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 dic 2011 17:47:40
3

¿Cómo almacenas la fecha del evento: utilizando el campo predeterminado post_date del post o un campo meta personalizado?

Si estás utilizando el campo predeterminado post_date, puedes usar el filtro posts_where para agregar condiciones de búsqueda, así:

// Crear una función de filtrado que agregará nuestra cláusula WHERE a la consulta
function filter_where( $where = '' ) {
    // posts del 1 al 15 de marzo de 2010
    $where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
    return $where;
}

add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );

Para más ejemplos, por favor revisa el Codex.

En caso de utilizar un campo personalizado, supongo que tendrás que escribir tus propias consultas MySQL personalizadas. Es un poco más complicado. Aquí tienes un ejemplo:

global $wpdb;
$post_ids = $wpdb->get_col( "
    SELECT ID FROM {$wpdb->posts}
    JOIN {$wpdb->postmeta}
    WHERE ID=post_id
    AND meta_key='your_custom_meta_key'
    AND meta_value >= '2010-03-01'
    AND meta_value < '2010-03-16'
" );

foreach ( $post_ids as $post_id ) {
    $post = get_post( $post_id );
    // Hacer algo
}
wp_reset_postdata();
28 nov 2011 05:43:14
Comentarios

No necesitas usar una consulta personalizada para esto. Simplemente puedes usar "meta_query".

tollmanz tollmanz
28 nov 2011 05:52:06

@rilwis Creo que estoy cerca. Ahora tengo esto en mi archivo search.php http://www.pastebin.com/zMRwRihz y esto es lo que hay en mi formulario de búsqueda: http://www.pastebin.com/nZePhPHV Estoy usando jquery ui datepicker para seleccionar las fechas en el frontend (entrada de búsqueda de fecha). Esto es lo que obtengo en la URL después de enviar una búsqueda: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%‌​2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Aún así, no se devuelven resultados. ¿Alguna pista sobre qué está impidiendo que se muestren las publicaciones? Gracias.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 dic 2011 17:48:40

has codificado los valores de fecha de forma rígida. ¿Cómo lo haces dinámico, de forma segura?

ahnbizcad ahnbizcad
10 sept 2015 10:44:30