WordPress get_posts () problemas para comparar marcas de tiempo en meta_query

3 minutos de lectura

avatar de usuario
Bagazo

Buenos días. Tengo problemas para comparar una marca de tiempo devuelta como meta_key (que regresa como una cadena) con la marca de tiempo actual mientras se ejecuta get_posts().

Estoy tratando de obtener alguna publicación con end_date_time establecido en el futuro y estoy teniendo un comportamiento extraño. Estoy usando Campos personalizados avanzados y Campos personalizados avanzados: Selector de fecha y hora para establecer la hora.

Aquí está mi código:

$time = time();

$args = array(
    'post_type'         => 'webinars',
    'posts_per_page'    => -1,
    'meta_key'          => 'date',
    'orderby'           => array('meta_value_num' => 'ASC', 'title' => 'ASC'),
    'meta_query'        => array(
        array(
            'key'   =>  'end_date_time',
            'value' =>  $time,
            'compare' => '>='
        ),
    ),
);

$webinars = get_posts($args);

La consulta no devuelve ningún resultado si se configura de esta manera. Sé que hay una publicación con una marca de tiempo futura establecida para eliminar el meta_query lo muestra y puedo obtener la marca de tiempo guardada. (Se guarda como una cadena).

¿Hay algún problema con la comparación de cadenas como números en un meta_query? ¿Hay alguna manera de convertir end_date_time a una int antes de hacer la comparación?

También intenté convertir el tiempo en una cadena antes de pasarlo a $args, pero no parece haber una diferencia.

¿Alguien más se ha encontrado con este problema?

Actualizar

he modificado el $time variable para usar un tiempo pasado como este:

$time = time()-43200;

Después de hacer esto, la consulta parece estar funcionando bien. si me fijo end_date_time al futuro se mostrará en el ciclo, si lo configuro en el pasado, se eliminará del ciclo. Parece que hay algún tipo de discrepancia de tiempo que está causando esto. Sin la hora ajustada, los eventos que sucedieron dentro de dos horas desaparecerían, pero después del ajuste se mantienen visibles. Cuando tienen varias horas, todavía desaparecen según sea necesario.

¿Por qué funcionaría esto con la marca de tiempo ajustada? $time = time()-43200;pero no con $time = time();?

  • Suponiendo que el valor es de hecho una marca de tiempo (entero), entonces todo lo que necesita hacer es agregar esto a su meta_query: 'type' => 'numeric'.

    – nombre_usuario_aleatorio

    19 de enero de 2016 a las 16:56

  • Cuando var_dump() el valor dentro de un ciclo de trabajo, se devuelve como una marca de tiempo que se ha convertido en una cadena. Supongo que así es como se guarda en la base de datos.

    – Marc

    19 de enero de 2016 a las 17:05

  • Eso no debería importar… todavía estás haciendo una comparación numérica.

    – rnevio

    19 de enero de 2016 a las 17:26

Si está utilizando los ACF nativos Selector de fecha y horasolo debes agregar el tipo DATETIME para usted meta_query y asegúrese de que su value tiene el formato requerido yyyy-mm-dd hh:mm:ss.

'meta_query' => array(
    array(
        'key'     => 'end_date_time',
        'value'   => date('Y-m-d H:i:s', $time),
        'compare' => '>=',
        'type'    => 'DATETIME'
    ),
),

Controlar Selector de fecha y hora y WP Metaconsultas documentación.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad