什么时候\'pre_get_posts\'
WordPress已经做了很多事情,比如设置所有查询变量(以及您不发送的查询)和设置所有条件属性(所有is_*
属性)。因此,如果您想完全替换查询,您应该重置所有这些内容并设置自己的查询。
事实上,即使你的代码有效,WordPress也会使用page.php
作为模板。
然而,有一种更简单的方法:在WordPress做所有事情之前先行动。
一个好地方是\'request\'
过滤器挂钩,此时WordPress已经从url创建了查询变量,并将这些变量传递给WP_Query
, 您可以在发送之前拦截和更改查询参数。
该操作由WP
类,并传递要设置的查询变量(see code).
add_filter( \'request\', function( array $query_vars ) {
// triggered also in admin pages
if ( is_admin() )
return $query_vars;
// you should check also for page slug, because when pretty permalink are active
// WordPress use \'pagename\' query vars, not \'page_id\'
$id = isset($query_vars[\'page_id\']) && (int) $query_vars[\'page_id\'] === 84;
// remember to replace "slug" with real page slug
$name = isset($query_vars[\'pagename\']) && $query_vars[\'pagename\'] === \'slug\';
if ( ( $id || $name) && ! isset($query_vars[\'error\']) ) {
$query_vars = array(\'category_name\' => \'special-announcement\');
}
return $query_vars;
});
更换
\'slug\'
用你真正的页面,然后让WordPress做它的工作。
注意,我没有检查主查询,因为\'request\'
仅对主查询触发。
如果要使用特定模板,应在上使用筛选器template_include
否则\'category.php\'
(或根据template hierarchy) 将使用。