No puedo obtener borradores con WP_Query usando el parámetro post_status
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.

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')
);

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.

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

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.

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

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?

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