无法使用QUERY_POST获取已发布的帖子

时间:2016-03-26 作者:user1889580

我不知道这为什么不起作用,因为它是一个非常简单的查询。当我拉取所有帖子(包括挂起的帖子)时,它会起作用,但当我想获取只发布的帖子时,它不会起作用。

我有一个获取帖子的功能。我传入一个布尔变量。如果是真的,我想从名为books的自定义帖子类型中提取所有帖子,包括挂起/草稿的帖子。如果为false,我只想要发布的帖子。我认为代码没有问题,但它不会工作。

$args = array( 
    \'post_type\' => \'book\',
    \'showposts\' => -1,
    \'tax_query\' =>  array(\'relation\' => \'AND\',
        array( \'taxonomy\' => \'book-category\', \'field\' => \'term_id\', \'terms\' => $termid)
    ),
    \'orderby\' => \'date\',
    \'order\' => \'ASC\'
);

if($getpending == true) $args["post_status"] = "any";
else $args["post_status"] = "publish";

$posts = query_posts($args);

3 个回复
最合适的回答,由SO网友:engelen 整理而成

首先,你可能不应该使用query_posts, 它修改了WordPress的主循环,几乎不适合任何用途(阅读When should you use WP_Query vs query_posts() vs get_posts()? 了解更多信息)。原因有很多query_posts 在这种情况下不会像预期的那样工作。

WordPress有两种获取帖子的合适方法:WP_Query 对象和get_posts 作用它们的工作原理非常相似get_posts 使用WP_Query 内部。然而,正如人们所料,WP_Query 允许更多控制。

对于你的情况,get_posts 应该可以工作(因为您发布的代码中没有进一步的缺陷)。

SO网友:Pieter Goosen

除了使用query_posts, 您还有一个问题,那就是本地使用global$posts 变量$posts 用于保存主查询的posts数组的全局。切勿将全局变量用作局部变量。更改全局变量非常糟糕,因为您会破坏它们的原始值和预期值,这很难调试。而不是使用$posts, 使用自定义变量,如$posts_array.

您很可能也不需要自定义查询,但如果需要,请使用WP_Queryget_posts(), 从不使用query_posts. 我已经详细讨论了this post 这也与几个非常重要的帖子有关。

只需快速触及其他几点:

您真的应该处理代码的缩进和分隔。当你把这么多东西塞进一行代码中时,你的代码有点难以阅读和调试。

你应该小心设置post_statusany 因为这会暴露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 仅表示trashauto-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 更改主查询

  • SO网友:WP-Silver

    尝试改用自定义查询https://codex.wordpress.org/Class_Reference/WP_Query 使用query\\u posts()时https://codex.wordpress.org/Function_Reference/query_posts 不是为了被插件或主题使用。

    用以下代码替换您的代码:

    $args = array( 
            \'post_type\' => \'book\',
            \'posts_per_page\' => -1,
            \'tax_query\' =>  array(
                                    \'relation\' => \'AND\',
                                    array( \'taxonomy\' => \'book-category\', 
                                            \'field\' => \'term_id\', 
                                            \'terms\' => $termid
                                            )
            ),
            \'orderby\' => \'date\',
            \'order\' => \'ASC\'
        );
    
        if($getpending == true) 
            $args["post_status"] = "any";
            else 
            $args["post_status"] = "publish";
    
        $ustom_posts = new WP_Query($args);
        if($ustom_posts->have_posts())
            {
                $ustom_posts->the_post();
    
                //echo $post->post_title;   
                //your further code
            }
    

    相关推荐