6

我正在尝试使用WP_Query对象编写一个新的查询函数。

我创建了一个新的模板文件并放入以下内容:

        $query_args = array(
            'post_type' => 'page',
            'post_parent=41',
        );

        // The Featured Posts query.
        $results = new WP_Query($query_args);

但是无论我使用什么参数,查询都不会改变。看起来好像查询已经初始化并且创建新WP_Query查询对现有查询没有任何影响。

在我的代码之前调用的唯一 wordpress 函数是get_header()不包括对WP_Queryor的任何调用query_posts

我放了下面一行来找出实际的 sql 查询是什么:

echo $GLOBALS['wp_query']->request;

实际的sql查询是:

SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '14') AND wp_posts.post_type = 'page' ORDER BY wp_posts.post_date DESC

当我更改我的$query_args.

我想知道全局变量何时$wp_query初始化,我应该怎么做才能使用自己的查询?

4

2 回答 2

19

您正在创建一个 WP_Query对象并将其保存到$results. 那是查询结果的位置,而不是$GLOBALS['wp_query']. 当然它不会覆盖$wp_query. 它们是不同的东西。试试var_dump($results)吧。

$wp_query您可以通过创建一个新WP_Query对象来覆盖,如下所示$wp_query = new WP_Query($query_args);:但这效率不高。当您只需要一个查询时,您运行两个查询。更好的方法是连接到pre_get_posts. 就像是:

function alter_query_so_15250127($qry) {
   if ( $qry->is_main_query() && is_page('featured-posts-page') ) {
     $qry->set('post_type','page');
     $qry->set('post_parent',41);
   }
}
add_action('pre_get_posts','alter_query_so_15250127');

if条件非常重要。您需要使用该行来确保过滤器仅在您希望它触发的页面上触发。你的问题没有足够的细节让我计算出精确的条件。

于 2013-03-06T14:54:37.777 回答
8

请查看http://codex.wordpress.org/Function_Reference/query_posts中发布的下图 在此处输入图像描述

于 2013-10-04T19:43:17.173 回答