Como obter todas as postagens com qualquer status de postagem?

38

Estou criando um painel de front end em que preciso mostrar todas as postagens do usuário atual. Então, eu preciso mostrar posts em todos os estados, principalmente published, trashede no pending. Agora estou usando uma consulta simples, mas ela está retornando apenas as postagens publicadas.

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

Alguém pode ajudar? O que mais eu preciso fazer?

Sisir
fonte
4
Você já tentou usar o post_statusparâmetro , ie. 'post_status' => 'any'?
T31os
2
Eu fortemente recomendo o uso WP_Query pre_get_postsou get_postsem vez de query_posts. Nunca usequery_posts
Tom J Nowell
@TomJNowell: que era caminho de volta :) Eu uso WP_Query mais ofter agora ..
Sisir
11
@Sirir, tenha cuidado, use WP_Querypara front-end e get_postspara consultas de administrador, pois há um problema wp_reset_postdata(consulte a nota e o ticket sobre esse problema).
precisa saber é o seguinte

Respostas:

65

Você pode usar o 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. 

Não tenho certeza de que ele aceita 'any'; portanto, use e array com todos os tipos que você deseja:

$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
fonte
7
Você também pode usar get_post_stati()para obter todos os status, incluindo os personalizados.
fuxia
5
Uma oportunidade desperdiçada para matar uma query_postschamada ...
Tom J Nowell
Pena que não pode fazer algo assim 'post_status' => array( '!inherit' );(para indicar qualquer post_status que não herdam)
aequalsb
@aequalsb what about'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab
9

Existe uma maneira simples de obter todas as postagens com qualquer status:

$articles = get_posts(
 array(
  'numberposts' => -1,
  'post_status' => 'any',
  'post_type' => get_post_types('', 'names'),
 )
);

Agora você pode iterar em todas as postagens:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}
OzzyCzech
fonte
2
$ posts e $ post entram em conflito com os nomes das variáveis ​​do Wordpress . Se você estiver usando esse código para colocar algo diferente da div principal (conteúdo principal), isso substituirá o que seria mostrado na main. Se sua intenção é realmente substituir completamente os resultados da consulta original, é isso que você deseja, é claro. Mas ainda é uma boa idéia renomear as variáveis ​​$ posts e $ post.
Henrik Erlandsson 03/02
5
@ Henrik, não pretendo diminuir o seu comentário (sua lógica é sólida e segura), mas considero o uso de $ post / $ posts como perfeitamente aceitável dentro de uma função sem acesso às variáveis ​​globais $ post / $ posts - porque isso me ajuda a manter a lógica durante o desenvolvimento.
precisa saber é
6

O WP_Querymétodo de classe ->query()aceita um anyargumento para post_status. Veja wp_get_associated_nav_menu_items()para uma prova.

O mesmo vale para get_posts()(que é apenas um invólucro para a chamada acima).

kaiser
fonte
3
Nos documentos WP_Query: 'any' - recupera qualquer status, exceto aqueles dos tipos de postagem com 'exclude_from_search' definido como true. (Há um erro de digitação lá, eles realmente significam status de postagem em vez de tipos de postagem.) Isso significa status auto-drafte trashsão excluídos.
Tamlyn
@ Tamlyn Afaik, isso não é erro de digitação. Ele recupera qualquer status dos tipos de postagem disponíveis publicamente. Status são apenas termos. Eles próprios não possuíam propriedade pública ou privada . Você pode desabilitar uma taxonomia desabilitando o query_var... por qualquer motivo que alguém faça isso. Sidenote: O plural do estado post é ... .
Kaiser
11
Se você rastrear o código (geralmente mais fácil do que ler os documentos, eu acho), poderá ver que WP_Query#get_posts()chamadas get_post_stati()que filtram $wp_post_statusesvalores onde exclude_from_searché verdadeiro, excluem da consulta as postagens com esses status . Existe um processo semelhante para os tipos de postagem quando post_type está definido como 'any'.
Tamlyn
@Tamlyn Depois de verificar o conteúdo da $wp_post_statusespropriedade, eu tenho que admitir que você está certo :)
kaiser
não funciona para o status da lixeira.
Maxwell sc
2

Na maioria dos casos, você pode usar get_posts()com o 'any'parâmetro para isso:

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

Mas dessa forma você não receberá postagens com status trashe auto-draft. Você precisa fornecê-los explicitamente, assim:

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

Ou você pode usar a função get_post_stati () para fornecer todos os status existentes explicitamente:

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

Mesmo se você passar anycomo post_status, ainda não receberá a postagem no resultado se todas as seguintes condições forem verdadeiras:

  1. Uma única postagem está sendo consultada. Um exemplo disso seria consultar por name, ou seja, a lesma.
  2. A postagem tem um status de publicação que não é público.
  3. O cliente não possui uma sessão de administração ativa, ou seja, você não está conectado no momento.

Solução

Consulta explicitamente para todos os status. Por exemplo, para consultar stati que não são trashou auto-draft(é muito improvável que você os queira), você pode fazer algo assim:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
XedinNão conhecido
fonte