¿Cómo buscar eventos entre dos fechas establecidas en WordPress?
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.
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);

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.

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.

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

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

@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.
