除了使用query_posts
, 您还有一个问题,那就是本地使用global$posts
变量$posts
用于保存主查询的posts数组的全局。切勿将全局变量用作局部变量。更改全局变量非常糟糕,因为您会破坏它们的原始值和预期值,这很难调试。而不是使用$posts
, 使用自定义变量,如$posts_array
.
您很可能也不需要自定义查询,但如果需要,请使用WP_Query
或get_posts()
, 从不使用query_posts
. 我已经详细讨论了this post 这也与几个非常重要的帖子有关。
只需快速触及其他几点:
您真的应该处理代码的缩进和分隔。当你把这么多东西塞进一行代码中时,你的代码有点难以阅读和调试。
你应该小心设置post_status
到any
因为这会暴露private
向未登录用户发布,它还将显示future
尚未发布的帖子。这还可能会公开您不想显示的自定义状态。相当明确地设置所需的post状态。
从…起query.php
if ( in_array( \'any\', $q_status ) ) {
foreach ( get_post_stati( array( \'exclude_from_search\' => true ) ) as $status ) {
if ( ! in_array( $status, $q_status ) ) {
$e_status[] = "$wpdb->posts.post_status <> \'$status\'";
}
}
} else {
注:
\'exclude_from_search\' => true
仅表示
trash
和
auto-draft
被排除在
any
showposts
已放弃支持posts_per_page
. 它不折旧,但如果使用,它将转换为posts_per_page
, 那么为什么不使用posts_per_page
从一开始if ( isset($q[\'showposts\']) && $q[\'showposts\'] ) {
$q[\'showposts\'] = (int) $q[\'showposts\'];
$q[\'posts_per_page\'] = $q[\'showposts\'];
}
无需将参数设置为默认值。你可以简单地省去这些,节省额外的空间和时间如果这是一个辅助查询,您可能会看到如下内容:(需要PHP 5.4+)
$args = [
\'post_type\' => \'book\',
\'posts_per_page\' => -1,
\'order\' => \'ASC\'
\'tax_query\' => [
[
\'taxonomy\' => \'book-category\',
\'terms\' => $termid
]
],
];
if ( true == $getpending ) {
if ( is_user_logged_in() ) { // This can be adjusted to match core
$args["post_status"] = [\'publish\', \'private\', \'draft\'];
} else {
$args["post_status"] = [\'publish\', \'draft\'];
}
}
$posts_array = WP_Query( $args );
我相信terms
你的价值tax_query
, 这可能是主要查询。如果是这样,你真的应该pre_get_posts
更改主查询