Parámetros WP_query para rango de fechas
Estoy usando el plugin events manager para crear posts personalizados para eventos. No necesito un blog, así que modifiqué el archivo index.php
de mi tema (usando un tema hijo) para que su consulta recupere el tipo de post "event" en la página de inicio.
new WP_Query ( array( 'paged' => $paged, 'post_type' => 'event', 'posts_per_page' => 4 )
(Solo he incluido el tipo de post 'event').
Hasta ahora todo bien. Pero muestra eventos actuales, pasados y futuros en la página de inicio. Quiero que solo muestre eventos actuales y futuros (es decir, quiero que los eventos que aún no han comenzado se muestren en la página de inicio también. Solo quiero evitar que se muestren los eventos pasados). He revisado la página del codex para WP_Query y utilicé el siguiente fragmento de código:
// Crear una nueva 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 < CURDATE() ";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' )
No produce el resultado deseado porque la fecha del evento no se almacena en post_date
en la base de datos.
Sin embargo, supongo que hay alguna manera fácil de hacer referencia a las fechas de los eventos, porque la fecha que se muestra automáticamente en la página de inicio no es la fecha de publicación de los posts, sino la fecha de inicio del evento, sin necesidad de realizar ninguna modificación.

Copiado de StackOverflow:
WP_Query
ofrece un parámetrodate_query
, que te permite establecer un rango con fechas de inicio y fin.https://developer.wordpress.org/reference/classes/wp_query/#date-parameters
$args = array(
'date_query' => array(
array(
'after' => '1 de enero de 2015',
'before' => '31 de diciembre de 2015',
'inclusive' => true,
),
),
);
$query = new WP_Query( $args );
Consulta la documentación enlazada para más detalles.
Ten en cuenta que la otra respuesta, que utiliza una consulta de postmeta, está realmente desactualizada, nadie debería hacer eso ahora que WP_Query
soporta estas consultas por fecha.

¿Podrías agregar la versión de WP donde se añadió este soporte?

Parece que necesitas un meta_query
.
$query = new WP_Query (
array(
'paged' => $paged,
'post_type' => 'event',
'posts_per_page' => 4,
'meta_query' => array(
array(
'key' => 'date_key_name',
'value' => date('Y-m-d'),
'compare' => '>=',
)
)
)
);
Ten en cuenta que tus fechas deben estar en un formato que una máquina pueda interpretar correctamente.
Referencia
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

el campo personalizado se almacena en formato YYYY-MM-DD. He intentado comparar usando meta_key + meta_value, meta_query + key + value, operadores '=' y 'LIKE'. Nada parece funcionar. Incluso insertando la fecha literal del evento.

Bueno, no, porque tu código espera que las fechas estén en tiempo Unix, supuse (¿incorrectamente?). Lo probaré ahora.

YYYY-MM-DD
, con o sin los separadores, se ordenará numéricamente. Es el único formato de fecha humano que se ordena numéricamente de la misma manera que se ordena en un calendario. Tiendo a preferir UNIXTIME
, o columnas DATE
/DATETIME
, pero creo que ese formato debería funcionar.

¿Qué pongo como valores de $date1 y $date2? Necesito verificar si la fecha de finalización del evento ya ha pasado, así que tengo que comparar la fecha de hoy con la fecha de finalización del evento, pero ¿cómo recupero la fecha de finalización del evento para establecerla como una de las variables?

@ruda.almeida quieres una relación OR
con las claves de inicio y fin - ya sea que la fecha de inicio sea igual o mayor que la fecha de hoy, o que la fecha de fin sea igual o mayor que la fecha de hoy.

@Milo no, quiero que los eventos que aún no han comenzado también se muestren en la página de inicio. Solo quiero evitar que se muestren eventos pasados.

@ruda.almeida sí, eso es lo que dije: ya sea que la fecha de inicio esté en el futuro, O la fecha de finalización esté en el futuro.

@Milo si la fecha de finalización está en el futuro, supongo que puedo ignorar la fecha de inicio.

@ruda.almeida ¡ajá, eso es cierto, no lo había pensado! aunque si quieres ordenar por fecha de inicio, esa clave debe ser parte de la consulta.

@s_ha_dum Esta edición es el código que había probado yo mismo cuando leí el codex sobre meta_query. No funcionó en ese momento, copié tu código (cambiando "date_key_name" por "event_end_date", obviamente, el nombre del campo personalizado). No funcionó. Creo que estoy haciendo algo mal =/

El nombre del campo en la base de datos es "_event_end_date
", pensé que necesitaba quitar el primer "_" pero funciona si lo mantengo.
