WP_Query no funciona como se espera para adjuntos y meta_query personalizados

15 may 2012, 15:56:20
Vistas: 3.08K
Votos: 2

Si uso get_posts() de esta manera obtengo varios resultados con el valor 1 para la meta_key my_key:

$posts = get_posts( 
    array( 
        'post_type'  => 'attachment', 
        'meta_key'   => 'my_key', 
        'meta_value' => '1' 
    ) 
);

//esto devuelve varios resultados como se esperaba
print_r($posts);

Sin embargo, si creo una consulta similar con WP_Query obtengo un array de resultados vacío

$args = array(
   'post_type' => 'attachment',
   'meta_query' => array(
       array(
       'key'     => 'my_key',
       'value'   => '1',
       'compare' => '=',
       'type'    => 'BINARY'

      )
   )
);

$query = new WP_Query();
$results = $query->query($args);
//esto está vacío
print_r($results);

He probado varias variaciones del array meta_query sin éxito. Estoy pensando que esto podría ser un error, pero quería asegurarme de que no me estoy perdiendo algo primero.

8
Comentarios

¿Olvidaste el ' después de value en tu código real, o es un error tipográfico específico de WPSE?

mor7ifer mor7ifer
15 may 2012 15:59:13

No, pero gracias, me preguntaba por qué el código no se formateaba.

Mike Mike
15 may 2012 16:04:37

¿Qué pasa si eliminas compare y type por completo?

mor7ifer mor7ifer
15 may 2012 16:06:40

siguiendo a @m0r7if3r: ¿qué pasa si cambias BINARY por NUMERIC?

moraleida moraleida
15 may 2012 16:09:07

Eliminar la comparación y el tipo no cambia el resultado... Numeric tampoco funciona

Mike Mike
15 may 2012 16:12:10

Si haces un print_r() de la instancia WP_Query creada, te muestra exactamente qué sentencia SQL se está generando y te da una idea de qué hay que hacer para arreglar la consulta.

EAMann EAMann
16 may 2012 17:01:15

No estoy seguro de dónde vinieron los votos negativos, esta es una pregunta legítima (que honestamente me dejó perplejo hasta que cargué la Debug Bar Console y examiné la instancia real de WP_Query). Intenta no tomarte los -1 como algo personal...

EAMann EAMann
16 may 2012 20:30:46

Gracias. Nada personal, solo un poco extraño ver cómo las cosas parecían bastante civilizadas aquí. En fin. Eché un vistazo al objeto WP_Query pero seguía perplejo. Me interesaría entender la lógica detrás de 'inherit' para archivos adjuntos publicados...

Mike Mike
16 may 2012 21:00:59
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 2
3
12

Primero, simplemente pasa tus argumentos al constructor de WP_Query ya que esto es más limpio y es la forma correcta de hacerlo según la documentación del Codex sobre la clase.

Deberías construir las cosas así:

$my_key_query_args = array(
   'post_type'   => 'attachment',
   'post_status' => 'inherit',
   'meta_query'  => array(
       array(
           'key'     => 'my_key',
           'value'   => '1',
           'compare' => '=',
           'type'    => 'BINARY'

      )
   )
);

$my_key_query = new WP_Query( $my_key_query_args );

Segundo, observa el parámetro adicional post_status en mi array. Por defecto, los archivos adjuntos se añaden con un estado de publicación "inherit" (heredado), pero WP_Query buscará publicaciones con los estados "published" (publicado), "draft" (borrador) o "pending" (pendiente). (Consulta también la documentación de ese parámetro).

Así que no hay ningún error aquí, simplemente olvidamos verificar los valores predeterminados de todos los parámetros pasados al objeto.

Hay una nota en la opción "attachment" para el parámetro post_type que menciona este requisito:

El WP_Query predeterminado establece 'post_status'=>'published', pero los archivos adjuntos tienen por defecto 'post_status'=>'inherit', por lo que necesitarás establecer el estado como 'inherit' o 'any'.

15 may 2012 18:50:04
Comentarios

Mira mi actualización. Este código actualizado está probado y funciona.

EAMann EAMann
16 may 2012 17:00:17

¿No debería ser publish el post_status?

Mike Mike
16 may 2012 18:00:32

El valor por defecto es publish, pero revisa en tu base de datos, el estado de publicación para los adjuntos es "inherit".

EAMann EAMann
16 may 2012 18:17:10
2

Creo que tu problema es que estás intentando usar WP_Query como si fuera get_posts(). Es bastante posible que la consulta esté funcionando, pero simplemente no puedes ver los resultados. WP_Query devuelve un objeto de consulta que debes recorrer de esta manera:

...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();

// haz lo que necesites

endwhile;

También ten en cuenta que he usado $my_query. No estoy completamente seguro de esto, pero creo que $query puede ser una variable reservada de WordPress, y en cualquier caso, suele ser mejor hacer que la consulta sea más legible para humanos (tal vez incluso $attachment_meta_query o algo similar).

15 may 2012 17:50:50
Comentarios

Gracias, pero tu código es efectivamente el mismo que el mío. Solo estás tomando un atajo. Así que esto no resuelve el problema. Realmente creo que podríamos tener un error entre manos.

Mike Mike
15 may 2012 18:18:40

Eso no es un atajo, sino más bien la sintaxis correcta para invocar un new WP_Query(). Pasa el array $args directamente a WP_Query(). También: recomiendo encarecidamente usar nombres de variables más descriptivos, para evitar conflictos de nombres.

Chip Bennett Chip Bennett
15 may 2012 19:45:14