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

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


谁能帮忙?我还需要做什么?

评论

您是否尝试过使用post_status参数,即。 'post_status'=>'任何'?

我强烈建议使用WP_Query pre_get_posts或get_posts而不是query_posts。切勿使用query_posts

@TomJNowell:那是回溯了:)我现在最常使用WP_Query。.

@Sisir小心点,将WP_Query用作前端,并将get_posts用作管理员查询,因为wp_reset_postdata存在问题(请参阅有关此问题的说明和票证)。

#1 楼

您可以使用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”,因此请使用具有所有所需状态的数组:

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


评论


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

– fuxia♦
13年1月31日,11:52

浪费机会杀死query_posts呼叫...

– Tom J Nowell♦
13年4月16日在12:45

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

–aequalsb
17年1月3日,1:17



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

– Cheslab
18-10-29在13:05

题外话。实际上,“任何”都是真实的东西。文件:developer.wordpress.org/reference/classes/wp_query/…

– Kirillrocks
1月20日14:26



#2 楼

有一种简单的方法,如何获取所有状态为所有的帖子:

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


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

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


评论


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

–亨里克·埃兰森(Henrik Erlandsson)
2014年2月3日在7:54



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

–aequalsb
17年1月3日,1:14



#3 楼

WP_Query类方法->query()接受anypost_status参数。请参见wp_get_associated_nav_menu_items()以获取证明。

get_posts()也是如此(它只是上述调用的包装器。)

评论


从WP_Query文档中:'any'-从'exclude_from_search'设置为true的帖子类型中检索任何状态。 (那里有一个错字,它们实际上是指帖子状态,而不是帖子类型。)这意味着自动草稿和废纸status状态被排除。

– Tamlyn
13年4月15日在12:50



@Tamlyn Afaik,这不是错字。它从公开可用的帖子类型中检索任何状态。状态只是条款。他们自己没有公共或私有财产。您可以通过禁用query_var ...来禁用分类法,无论出于何种原因。旁注:职位状态的复数是...。

– kaiser
13年4月15日在14:30

如果您查找代码(通常比阅读文档更容易),您会发现WP_Query#get_posts()调用get_post_stati()会过滤$ wp_post_statuses以获取其中exclude_from_search为true的值,然后从查询中排除具有这些状态的帖子。当post_type设置为“ any”时,对于帖子类型也有类似的过程。

– Tamlyn
13年4月16日在11:15



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

– kaiser
13年4月16日在12:07

不适用于垃圾箱状态。

– Maxwell s.c
18/12/10在20:56

#4 楼

在大多数情况下,您可以将get_posts()'any'参数一起使用:

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


但是这样一来,您将不会收到状态为trashauto-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',
 )
);


#5 楼

即使将any传递为post_status,如果满足以下所有条件,您仍然不会获得结果的帖子:


正在查询单个帖子。例如,可以通过name来查询,即slug。
帖子的发布状态为非公开。
客户端没有活动的管理会话,即您当前尚未登录。

解决方案

显式查询每个状态。例如,要查询不是trashauto-draft的stati(您不太可能想要这些),您可以执行以下操作:

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