WP_Query no funciona como se espera para adjuntos y meta_query personalizados
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.

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

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

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.
