如何获取具有任何帖子状态的所有帖子?


38

我正在创建一个前端仪表板,其中需要显示当前用户的所有帖子。所以,我需要显示的帖子在所有各州,主要是publishedtrashedpending。我现在使用一个简单的查询,但它仅返回已发布的帖子。

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

有人可以帮忙吗?我还需要做什么?


4
您是否尝试过使用post_status参数,即。'post_status' => 'any'
t31os 2011年

2
强烈建议使用WP_Query pre_get_postsget_posts代替query_posts。永远不要使用query_posts
Tom J Nowell

@TomJNowell:那回去了:)我现在最常使用WP_Query。–
Sisir

1
@Sisir一定要小心,WP_Query用于前端和get_posts管理员查询,因为存在问题wp_reset_postdata(有关此问题,请参阅注释票证)。
Aurovrata

Answers:


65

您可以使用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. 

我不确定它是否接受“ any”,因此请使用并与所需的所有类型一起使用数组:

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

7
您还可以get_post_stati()用来获取所有状态,包括自定义状态。
fuxia

5
浪费掉电话的机会query_posts...
Tom J Nowell

太糟糕了,我们不能做这样的事情'post_status' => array( '!inherit' );(表明除继承之外的任何post_status)
aequalsb

@aequalsb怎么样'post_status' => array_diff(get_post_stati(), ['inherit']);
Cheslab

9

有一个简单的方法,如何获取具有任何状态的所有帖子:

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

现在,您可以遍历所有帖子:

foreach ($articles as $article) { 
 echo $article->ID . PHP_EOL; //...
}

2
$ posts和$ post与Wordpress自己的变量名冲突。如果您使用此代码将除主(主要内容)div之外的内容放入其他内容,这将覆盖main中显示的内容。如果您的目的确实是要完全替换原始查询结果,那么这当然是您想要的。但是重命名$ posts和$ post变量仍然是一个好主意。
Henrik Erlandsson

5
@Henrik我根本不打算减少您的评论(您的逻辑是合理且安全的),但我认为在函数内部使用$ post / $ posts是完全可以接受的,而无需访问全局$ post / $ posts变量-因为它有助于我在开发过程中保持逻辑。
aequalsb

6

所述WP_Query类方法->query()接受一个any为自变量post_status。请参阅wp_get_associated_nav_menu_items()以获取证明。

同样get_posts()(只是上述调用的包装器)。


3
从WP_Query文档中:' any'- 检索除'exclude_from_search'设置为true的帖子类型之外的任何状态。(那里有一个错字,实际上是指职位状态,而不是职位类型。)这是指状态auto-drafttrash不包括在内。
Tamlyn

@Tamlyn Afaik,这不是错字。它公开可用的帖子类型检索任何状态。地位只是条款。他们自己没有公共私有财产。您可以使用禁用禁用分类query_var......无论出于何种原因一会做到这一点。旁注:岗位状态的复数是...
kaiser

1
如果您通过代码进行跟踪(我发现,通常比阅读文档更容易),您会看到WP_Query#get_posts()调用get_post_stati()过滤$wp_post_statuses条件exclude_from_search为true的值的调用,然后从查询中排除具有这些状态的帖子。当post_type设置为'any'时,发布类型也有类似的过程。
Tamlyn

@Tamlyn检查$wp_post_statuses属性的内容后,我必须承认您是正确的:)
kaiser

不适用于垃圾箱状态。
Maxwell sc

2

在大多数情况下,您可以为此使用get_posts()with 'any'参数:

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

但是这样一来,您将不会收到带有状态trash和的帖子auto-draft。您需要明确提供它们,如下所示:

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

或者,您可以使用get_post_stati()函数显式提供所有现有状态:

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

1

即使通过anyas post_status,如果满足以下所有条件,您仍然不会获得结果的帖子

  1. 正在查询一个帖子。一个例子是通过name,即slug 查询。
  2. 该帖子的帖子状态为非公开。
  3. 客户端没有活动的管理会话,即您当前尚未登录。

明确查询每种状态。例如,要查询不是trash或不是的stati auto-draft(您不太可能想要这些),可以执行以下操作:

$q = new WP_Query([
    /* ... */
    'post_status' => get_post_stati(['exclude_from_search' => false]),
]);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.