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

38

Estoy creando un panel frontal donde necesito mostrar todas las publicaciones del usuario actual. Por lo tanto, necesito mostrar publicaciones en todos los estados, principalmente published, trashedy el pending. Ahora estoy usando una consulta simple pero solo devuelve las publicaciones publicadas.

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID              
    );
    query_posts($query);

¿Alguien puede ayudar? ¿Qué más necesito hacer?

Sisir
fuente
44
¿Has intentado usar el post_statusparámetro , es decir. 'post_status' => 'any'?
t31os
2
Yo fuertemente recomiendo el uso de WP_Query pre_get_postso get_postsen lugar de query_posts. Nunca usequery_posts
Tom J Nowell
@TomJNowell: eso fue hace mucho tiempo :) Utilizo WP_Query la mayoría de las veces ahora ..
Sisir
1
@Sisir tenga cuidado, utilícelo WP_Querypara el front-end y get_postspara consultas administrativas ya que existe un problema con wp_reset_postdata(vea la nota y el ticket sobre este problema).
Aurovrata

Respuestas:

65

Puede usar el parámetro post_status:

* 'publish' - a published post or page
* 'pending' - post is pending review
* 'draft' - a post in draft status
* 'auto-draft' - a newly created post, with no content
* 'future' - a post to publish in the future
* 'private' - not visible to users who are not logged in
* 'inherit' - a revision. see get_children.
* 'trash' - post is in trashbin. added with Version 2.9. 

No estoy seguro de que acepte 'cualquiera', así que use y realice una matriz con todos los tipos que desee:

$query = array(
    'post_type' => 'my-post-type',
    'post_author' => $current_user->ID,
    'post_status' => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash')    
);
$loop = new WP_Query($query);

while ( $loop->have_posts() ) : $loop->the_post();
Bainternet
fuente
77
También puede usar get_post_stati()para obtener todos los estados, incluidos los personalizados.
fuxia
55
Una oportunidad desperdiciada para matar una query_postsllamada ...
Tom J Nowell
lástima que no podamos hacer algo como esto 'post_status' => array( '!inherit' );(para indicar cualquier estado post_stato que no sea heredar)
aequalsb
@aequalsb ¿qué pasa?'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Hay una manera simple de cómo 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 en todas las publicaciones:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
fuente
2
$ posts y $ post entran en conflicto con los propios nombres de variables de Wordpress . Si está utilizando este código para poner algo diferente al div primario (contenido principal), esto sobrescribirá lo que se habría mostrado en main. Si su intención realmente es reemplazar completamente los resultados de la consulta original, esto es lo que desea, por supuesto. Pero sigue siendo una buena idea cambiar el nombre de las variables $ posts y $ post.
Henrik Erlandsson
55
@Henrik, no tengo la intención de disminuir su comentario (su lógica es sólida y segura), pero considero usar $ post / $ posts como 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
6

El WP_Querymétodo de clase ->query()acepta un anyargumento para post_status. Ver wp_get_associated_nav_menu_items()para una prueba.

Lo mismo ocurre con get_posts()(que es solo un contenedor para la llamada anterior).

emperador
fuente
3
De los documentos WP_Query: 'any': recupera cualquier estado, excepto los de los tipos de publicación con 'exclude_from_search' establecido en verdadero. (Hay un error tipográfico allí, en realidad significan estados de publicación en lugar de tipos de publicación). Esto significa estados auto-drafty trashestán excluidos.
Tamlyn
@Tamlyn Afaik, esto no es un error tipográfico. Se recupera un estatus de tipos de envíos que están disponibles públicamente. El estado son solo términos. No obtuvieron ninguna propiedad pública o privada . Usted podría desactivar una taxonomía con la desactivación de la query_var... por la razón que sea uno haría eso. Nota al margen: El plural de estado post es ... .
kaiser
1
Si rastrea el código (a menudo es más fácil que leer los documentos, creo), puede ver que las WP_Query#get_posts()llamadas get_post_stati()que filtran $wp_post_statusesvalores donde exclude_from_searchson verdaderas, excluyen las publicaciones con estos estados de la consulta. Hay un proceso similar para los tipos de publicación cuando post_type se establece en 'any'.
Tamlyn
@Tamlyn Después de verificar el contenido de la $wp_post_statusespropiedad, tengo que admitir que tienes razón :)
kaiser
no funciona para el estado de la papelera.
Maxwell sc
2

En la mayoría de los casos se puede utilizar get_posts()con el 'any'parámetro para esto:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => 'my-post-type',
 )
);

Pero de esta manera no obtendrás publicaciones con estado trashy auto-draft. Debe proporcionarlos explícitamente, así:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any, trash, auto-draft',
  'post_type' => 'my-post-type',
 )
);

O puede usar la función get_post_stati () para proporcionar explícitamente todos los estados existentes:

$posts = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => get_post_stati(),
  'post_type' => 'my-post-type',
 )
);
Sergey Zaharchenko
fuente
1

Incluso si pasa anycomo post_status, aún no obtendrá la publicación en el resultado si se cumplen todas las condiciones siguientes:

  1. Se está consultando una sola publicación. Un ejemplo de esto sería consultar por name, es decir, la babosa.
  2. La publicación tiene un estado de publicación que no es público.
  3. El cliente no tiene una sesión de administrador activa, es decir, no está conectado actualmente.

Solución

Consulta explícitamente para cada estado. Por ejemplo, para consultar estadísticas que no son trasho auto-draft(es bastante improbable que las desee), podría hacer algo como esto:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
Xedin Desconocido
fuente