¿Cómo obtener todas las entradas con cualquier estado de publicación?

30 mar 2011, 16:41:40
Vistas: 209K
Votos: 62

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?

4
Comentarios

¿Has probado a usar el parámetro post_status, es decir, 'post_status' => 'any'?

t31os t31os
30 mar 2011 16:50:57

Te recomiendo encarecidamente usar WP_Query, pre_get_posts o get_posts en lugar de query_posts. Nunca uses query_posts.

Tom J Nowell Tom J Nowell
16 abr 2013 15:45:53

@TomJNowell: eso fue hace mucho :) Ahora uso WP_Query casi siempre..

Sisir Sisir
17 abr 2013 20:22:07

@Sisir ten cuidado, usa WP_Query para el front-end y get_posts para consultas en el administrador ya que hay un problema con wp_reset_postdata (mira la nota y el ticket sobre este problema).

Aurovrata Aurovrata
30 ene 2017 10:10:19
Todas las respuestas a la pregunta 6
7
111

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();
30 mar 2011 17:20:50
Comentarios

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

fuxia fuxia
31 ene 2013 13:52:04

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

Tom J Nowell Tom J Nowell
16 abr 2013 15:45:09

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

aequalsb aequalsb
3 ene 2017 03:17:26

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

Cheslab Cheslab
29 oct 2018 15:05:59

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

kirillrocks kirillrocks
20 ene 2020 16:26:58

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?

User User
23 may 2022 11:19:54

@user75665, tu afirmación es incorrecta. 'post_status'=>'any' no recuperará las publicaciones en la papelera.

brett brett
17 abr 2024 16:37:44
Mostrar los 2 comentarios restantes
4
24

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; //...
}
31 ene 2013 11:55:21
Comentarios

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 Erlandsson Henrik Erlandsson
3 feb 2014 09:54:50

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

aequalsb aequalsb
3 ene 2017 03:14:57

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

Sagive Sagive
12 may 2022 13:16:26

Esta es la respuesta correcta a la pregunta Cómo obtener todas las publicaciones con cualquier estado de publicación. any te dará CUALQUIER estado de tipo de publicación.

User User
23 may 2022 11:20:24
0

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',
 )
);
28 ago 2019 21:32:09
5

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

5 oct 2012 14:02:06
Comentarios

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 Tamlyn
15 abr 2013 15:50:16

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

kaiser kaiser
15 abr 2013 17:30:34

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 Tamlyn
16 abr 2013 14:15:03

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

kaiser kaiser
16 abr 2013 15:07:27

no funciona para el estado de papelera.

Maxwell s.c Maxwell s.c
10 dic 2018 22:56:29
0

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:

  1. Se está consultando una única publicación. Un ejemplo de esto sería consultar por name, es decir, el slug.
  2. La publicación tiene un estado que no es público.
  3. 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])),
]);
28 mar 2019 02:04:21
1

Como aún no puedo comentar: $args['post_status']='any'; funciona para 'publish' y 'draft', pero no para 'trash', necesité $args['post_status']=array('any','trash');

23 ago 2021 00:35:56
Comentarios

¡Bienvenido a WPSE! :)

Sisir Sisir
23 ago 2021 15:04:07