WP_Query meta_query rango de fechas con 2 campos personalizados

1 minuto de lectura

Tengo un tipo de publicación personalizada ‘eventos’ que contiene campos personalizados para start_date y end_date. Estoy tratando de hacer una lista simple de los próximos eventos. Si consulto solo eventos con una fecha de inicio> = hoy, funciona bien. Si agrego una meta_consulta para decir “Y” todos los eventos con una fecha de finalización

Mis campos personalizados (start_date, end_date) se almacenan como marcas de tiempo de Unix, por lo que estoy usando ‘NUMERIC’ y ‘meta_value_num’. $today es una marca de tiempo de la fecha actual. Aquí hay ejemplos de lo que estoy tratando de hacer… Arrancarme el pelo – ¡cualquier ayuda sería apreciada!

ESTO FUNCIONA:

$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),

    )
);

Cuando agrego una segunda matriz para meta_query, NO FUNCIONA:

$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'NUMERIC',
        ),

    )
);

Cuando uso meta_compare en la consulta principal y una sola meta_query, NO FUNCIONA:

$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $today,
    'meta_compare' => '>=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'date',
        ),

    )
);

Cuando uso meta_compare en la consulta principal y varias meta_consultas, NO FUNCIONA:

$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $today,
    'meta_compare' => '>=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'NUMERIC',
        ),

    )
);

Así es como lo estoy usando y funciona bien para mí.

$the_query = new WP_Query(array(
    'post_type' => 'job',
    'posts_per_page'   => 25,
    'meta_query' => array(
        array(
            'key' => 'published_date',
            'value' => array('20140401','20140405'),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        )
    )
));


if ($the_query->have_posts()) {

    echo '<ul>';
    while ($the_query->have_posts()) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';

} else {
    echo 'Sorry! No Posts';
}

wp_reset_postdata();

La nota más importante del códice.

El ‘tipo’ FECHA funciona con el valor ‘comparar’ ENTRE solo si la fecha es almacenado en el formato AAAAMMDD y probado con este formato.

avatar de usuario
Tendencias a futuro

Esto es lo que terminé haciendo:

$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $yesterday,
    'meta_compare' => '<=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => array($first_minute,$last_minute),
            'compare' => 'BETWEEN',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $yesterday,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'start_date',
            'value' => $yesterday,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),


    )
)

Esto obtiene los eventos del mes actual. Ingresé variables para el primer minuto del mes, el último minuto del mes y “ayer”, que son las 11:59:59 de ayer.

No estoy seguro de lo que está intentando, pero parece lógico no devolver nada, ya que está seleccionando eventos que comienzan hoy o en el futuro (start_date >= $today) Y terminan hoy o en el pasado (end_date

¡Alexandru-Florentin Popescu tiene razón! Use su código otro siguiente:

$args = array(  
'post_type' => 'events',
'posts_per_page' => -1,
'meta_key' => 'start_date',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
    'relation' => 'AND',
    array(
        'key' => 'start_date',
        'value' => $today,
        'compare' => '<=',
        'type' => 'NUMERIC',
    ),
    array(
        'key' => 'end_date',
        'value' => $today,
        'compare' => '>=',
        'type' => 'NUMERIC',
    ),

));

Solo necesita cambiar la clave ‘comparar’ en ambas matrices

¿Ha sido útil esta solución?