No puedo obtener borradores con WP_Query usando el parámetro post_status

16 feb 2012, 02:02:25
Vistas: 15K
Votos: 1

No logro que los borradores aparezcan con WP_Query, incluso cuando post_status está configurado como 'any' o 'draft'

        $args = array(
                    'p' => 1234, 
                    'post_type' => 'any',
                    'post_status' => 'any'
                    );
        $query = new WP_Query( $args );

        while ( $query->have_posts() ) : $query->the_post();
            // mostrar el post
        endwhile;

        wp_reset_postdata();

Si vuelvo y publico el post 1234, WP_Query lo recupera correctamente. Pero cuando está como borrador, ni any ni draft lo capturan.

Leí que el parámetro exclude_from_search en register_post_type() evita que los posts aparezcan con WP_Query, así que lo establecí como false en el post_type del que estoy recuperando, así:

$args = array(
    'labels' => $labels,
    'description' => '',
    'public' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'show_ui' => true,
    'menu_position' => 60,
    'menu_icon' => null,
    'capability_type' => post,
    'hierarchical' => false,
    'supports' => array('title', 'editor', 'author', 'excerpt', 'trackbacks', 'custom-fields', 'revisions'),
    'rewrite' => true,
    'query_var' => true,
    'can_export' => true,
    'show_in_nav_menus' => true,
);

register_post_type('chart', $args);

¿Hay algo que esté pasando por alto? No entiendo por qué un post borrador en este tipo de contenido no aparecería en la consulta anterior.

6
Comentarios

¿qué obtienes si haces print_r( $query )? Me pregunto si have_posts() o the_post() están evitando que se muestren los borradores...

mor7ifer mor7ifer
16 feb 2012 03:57:00

Aquí está el resultado de imprimir la consulta: http://pastebin.com/MpZK2vPf

supertrue supertrue
16 feb 2012 09:15:48

¿¡Y eso es un print_r() sobre $query!? Parece que no está consultando... mira mi respuesta.

mor7ifer mor7ifer
16 feb 2012 12:35:05

¿Has intentado reemplazar p con post__in?

mrwweb mrwweb
23 may 2012 19:59:37

Tu consulta-- la primera en tu pregunta-- funciona para mí con un par de tipos de publicaciones diferentes. Sospecho que tienes un plugin o algo en tu tema que está manipulando tus consultas de una manera que está afectando esta. Desactiva tus plugins y cambia al tema predeterminado para ver qué sucede.

s_ha_dum s_ha_dum
4 nov 2012 17:43:40

@supertrue ¿encontraste una solución para esto?

Capiedge Capiedge
3 abr 2017 19:36:36
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 3
3

Intenta pasarlo como un array.

Por ejemplo

$args = array(
    'p' => 1234, 
    'post_type' => 'any',
    'post_status' => array('draft')
);

O para todos los tipos

$args = array(
    'p' => 1234, 
    'post_type' => 'any',
    'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')
);
16 feb 2012 02:19:42
Comentarios

Desafortunadamente, eso no funcionó. Según el codex y trac, post_status debería aceptar una cadena, un array o una cadena separada por comas por igual.

supertrue supertrue
16 feb 2012 02:55:01

Puedo confirmar que esto funcionó para mí, cuando necesitaba obtener pendientes y borradores. Gracias

Jase Whatson Jase Whatson
11 dic 2012 00:32:16

Acabo de hacer una prueba con 4.7.2 con el 'post_type' como un array de 'any', y una cadena de texto de 'any' [así que 'post_type' => array('any') 'post_type' => 'any' ] y ambos parámetros pudieron obtener posts en borrador

Rick Hellewell Rick Hellewell
17 feb 2017 00:49:16
0

Acabo de encontrarme con este escenario exacto. En mi opinión debería funcionar, pero cuando probé una combinación de 'p' => 123 y 'post_status' => 'any', no devolvía el post si el estado era borrador.

Pude solucionarlo usando 'post__in' => array( 123 ) en su lugar. Así:

$args = array(
    'post__in' => array( 123 ),
    'post_type' => 'any',
    'post_status' => 'any',
);
$query = new WP_Query( $args );
// ... etc.
18 oct 2017 17:44:02
5

Parece que podrías tener un error extraño. Intenta reemplazar la línea única de WP_Query con lo siguiente:

$query = new WP_Query();
$posts = $query->query( $args );
16 feb 2012 12:36:48
Comentarios

¿Entonces también debería cambiar $query a $posts en $query->have_posts() y $query->the_post()?

supertrue supertrue
16 feb 2012 16:21:12

Sí, aunque podrías nombrar mi $query como $my_query y mi $posts como $query y no habría mucha diferencia. Básicamente, el problema que estoy tratando de evitar es el fallo de la consulta al procesarse... por cierto, ¿dónde pusiste ese print_r() que hiciste?

mor7ifer mor7ifer
17 feb 2012 03:46:32

Lo puse después de WP_Query y antes del bucle, así: $query = new WP_Query( $args ); print_r($query); while ( $query->have_posts() ) : $query->the_post();.

supertrue supertrue
17 feb 2012 20:44:54

Sí, intenta llamar al método query() y mira cómo te va.

mor7ifer mor7ifer
18 feb 2012 06:54:05

¿Alguna solución para esto?

Ben Racicot Ben Racicot
7 mar 2015 18:30:08