¿Cómo obtener todas las entradas con cualquier estado de publicación?
Estoy creando un panel de control frontend donde necesito mostrar todas las entradas del usuario actual. Por lo tanto, necesito mostrar las entradas en todos los estados, principalmente published
, trashed
y pending
. Actualmente estoy usando una consulta simple pero solo está devolviendo las entradas publicadas.
$query = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID
);
query_posts($query);
¿Alguien puede ayudar? ¿Qué más necesito hacer?

Puedes usar el parámetro post_status:
* 'publish' - una entrada o página publicada
* 'pending' - entrada pendiente de revisión
* 'draft' - una entrada en estado de borrador
* 'auto-draft' - una entrada recién creada, sin contenido
* 'future' - una entrada programada para publicarse en el futuro
* 'private' - no visible para usuarios no logueados
* 'inherit' - una revisión. ver get_children.
* 'trash' - entrada en la papelera. añadido en la Versión 2.9.
No estoy seguro de que acepte 'any', así que usa un array con todos los estados que necesites:
$args = array(
'post_type' => 'my-post-type',
'post_author' => $current_user->ID,
'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')
);
$query = new WP_Query($args);
while ( $query->have_posts() ) : $query->the_post();

También podrías usar get_post_stati()
para obtener todos los estados, incluyendo los personalizados.

Una oportunidad perdida para eliminar una llamada a query_posts
...

lástima que no podamos hacer algo como esto 'post_status' => array( '!inherit' );
(para indicar cualquier post_status que no sea inherit)

@aequalsb ¿qué tal 'post_status' => array_diff(get_post_stati(), ['inherit']);

fuera de tema. 'any' es algo real en realidad. Documentación: https://developer.wordpress.org/reference/classes/wp_query/#post-type-parameters

Esta es la respuesta incorrecta. any
es la respuesta correcta a la pregunta ¿Cómo obtener todas las entradas con cualquier estado de publicación?

Existe una forma sencilla de obtener todas las publicaciones con cualquier estado:
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => get_post_types('', 'names'),
)
);
Ahora puedes iterar a través de todas las publicaciones:
foreach ($articles as $article) {
echo $article->ID . PHP_EOL; //...
}

Los nombres de variables $posts y $post entran en conflicto con los nombres de variables propios de WordPress. Si estás utilizando este código para colocar algo que no sea en el div principal (contenido principal), esto sobrescribirá lo que se habría mostrado en el contenido principal. Si tu intención es realmente reemplazar por completo los resultados de la consulta original, esto es lo que deseas, por supuesto. Pero sigue siendo una buena idea renombrar las variables $posts y $post.

@Henrik no pretendo minimizar tu comentario en absoluto (tu lógica es sólida y segura), pero considero que usar $post/$posts es perfectamente aceptable dentro de una función sin acceso a las variables globales $post/$posts -- porque me ayuda a mantener la lógica durante el desarrollo.

bueno... casi - solo pruébalo vs la respuesta de @bainternet, probablemente obtendrás un conteo diferente. no incluye auto-draft y trashed.

En la mayoría de los casos puedes usar get_posts()
con el parámetro 'any'
para esto:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'post_type' => 'my-post-type',
)
);
Pero de esta manera no obtendrás posts con estado trash
(papelera) y auto-draft
(borrador automático). Necesitas proporcionarlos explícitamente, así:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any, trash, auto-draft',
'post_type' => 'my-post-type',
)
);
O puedes usar la función get_post_stati() para proporcionar todos los estados existentes explícitamente:
$posts = get_posts(
array(
'numberposts' => -1,
'post_status' => get_post_stati(),
'post_type' => 'my-post-type',
)
);

El método ->query()
de la clase WP_Query
acepta un argumento any
para post_status
. Consulta wp_get_associated_nav_menu_items()
para ver una prueba.
Lo mismo aplica para get_posts()
(que es simplemente un envoltorio para la llamada anterior).

De la documentación de WP_Query: 'any' - recupera cualquier estado excepto aquellos de tipos de entrada con 'exclude_from_search' establecido en true. (Hay un error tipográfico ahí, en realidad se refiere a estados de entrada en lugar de tipos de entrada.) Esto significa que los estados auto-draft
y trash
están excluidos.

@Tamlyn Hasta donde sé, esto no es un error tipográfico. Recupera cualquier estado de tipos de entrada que estén públicamente disponibles. Los estados son solo términos. No tienen una propiedad pública o privada en sí mismos. Podrías deshabilitar una taxonomía deshabilitando el query_var
... por cualquier motivo que alguien haría eso. Nota al margen: El plural de post status es....

Si rastreas el código (a menudo más fácil que leer la documentación, en mi experiencia) puedes ver que WP_Query#get_posts()
llama a get_post_stati()
que filtra $wp_post_statuses
para valores donde exclude_from_search
es true, luego excluye entradas con estos estados de la consulta. Hay un proceso similar para tipos de entrada cuando post_type está establecido en 'any'.

@Tamlyn Después de revisar el contenido de la propiedad $wp_post_statuses
, tengo que admitir que tienes razón :)

Aunque pases any
como post_status
, aún así no obtendrás la publicación en el resultado si se cumplen todas las siguientes condiciones:
- Se está consultando una única publicación. Un ejemplo de esto sería consultar por
name
, es decir, el slug. - La publicación tiene un estado que no es público.
- El cliente no tiene una sesión de administrador activa, es decir, no estás actualmente conectado.
Solución
Consulta explícitamente por cada estado. Por ejemplo, para consultar estados que no sean trash
(papelera) o auto-draft
(es poco probable que quieras estos), podrías hacer algo como esto:
$q = new WP_Query([
/* ... */
'post_status' => array_values(get_post_stati(['exclude_from_search' => false])),
]);
