Parámetros WP_query para rango de fechas

7 jun 2013, 21:26:17
Vistas: 25.2K
Votos: 6

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.

2
Comentarios

presumiblemente se está almacenando en post meta, usa get_post_custom para ver todos los metadatos asociados a un evento, y una consulta meta para consultar basada en la clave de fecha.

Milo Milo
7 jun 2013 21:35:38

@Milo lo está, pero no sé cómo analizarlo. Aquí está su salida: http://pastebin.com/3er1WBMv

That Brazilian Guy That Brazilian Guy
8 jun 2013 21:38:03
Todas las respuestas a la pregunta 2
2
12

Copiado de StackOverflow:

WP_Query ofrece un parámetro date_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.

23 abr 2019 22:34:38
Comentarios

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

That Brazilian Guy That Brazilian Guy
23 abr 2019 23:43:49

Como dice en el artículo del Codex que enlacé date_query (array) - Parámetros de fecha (disponible desde la Versión 3.7). así que es realmente antiguo en este punto, definitivamente seguro de usar :)

jerclarke jerclarke
23 abr 2019 23:59:08
15

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

7 jun 2013 21:42:00
Comentarios

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.

That Brazilian Guy That Brazilian Guy
8 jun 2013 08:08:19

¿Probaste el código que publiqué?

s_ha_dum s_ha_dum
8 jun 2013 15:18:32

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

That Brazilian Guy That Brazilian Guy
8 jun 2013 21:39:23

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.

s_ha_dum s_ha_dum
8 jun 2013 21:44:14

¿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?

That Brazilian Guy That Brazilian Guy
8 jun 2013 22:25:33

@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 Milo
8 jun 2013 22:33:49

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

That Brazilian Guy That Brazilian Guy
8 jun 2013 22:36:05

@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 Milo
8 jun 2013 22:52:45

@ruda.almeida : mira la edición. No se puede hacer ahora mismo.

s_ha_dum s_ha_dum
8 jun 2013 22:59:10

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

That Brazilian Guy That Brazilian Guy
8 jun 2013 23:05:08

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

Milo Milo
8 jun 2013 23:07:36

@Milo ¡ajá, eso es cierto, no lo había pensado! ;-)

That Brazilian Guy That Brazilian Guy
8 jun 2013 23:12:56

@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 =/

That Brazilian Guy That Brazilian Guy
8 jun 2013 23:14:26

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

That Brazilian Guy That Brazilian Guy
8 jun 2013 23:17:16

Ese primer guión bajo evita que los campos aparezcan en el cuadro de selección desplegable "Meta Personalizada".

s_ha_dum s_ha_dum
9 jun 2013 01:44:58
Mostrar los 10 comentarios restantes