我正在尝试使用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_Query
或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
什么时候被初始化,我应该怎么做才能使用我自己的查询?
答案 0 :(得分:16)
您正在创建新 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
条件非常重要。您需要使用该行来确保过滤器仅在您要触发的页面上触发。你的问题没有足够的细节让我弄清楚确切的条件。
答案 1 :(得分:8)