pre_get_posts on a page

时间:2012-09-04 作者:janw

是否可以使用pre_get_posts 滤器我试过了,但似乎不起作用。

function pre_wp_queries( $query ) {
    // only trigger on main qyery
    if ( !$query->is_main_query() )
        return;

    if (is_page_template(\'TEMPLATE_NAME.php\')) {
        $query->query_vars[\'pagename\'] = null;
        $query->query_vars[\'post_type\'] = \'post\';
        $query->query_vars[\'posts_per_page\'] = 3;
        $query->query_vars[\'cat\'] = 13;
    }
}
add_action(\'pre_get_posts\', \'pre_wp_queries\', 9001);
在收割台上。php我使用此行检查它是否有效:

var_dump($GLOBALS[\'wp_query\']->request);
它显示:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
  AND wp_posts.post_type = \'post\'
ORDER BY wp_posts.post_date DESC 
因此,它更改了posttype,但没有更改其余的posttype。它也会转到404页。事实上$GLOBALS[\'wp_query\']->queried_object 返回原始页面。我在两个WP安装上都尝试了相同的行为。

这是正确的行为,还是我遗漏了什么?

1 个回复
SO网友:kaiser

解释对象

您不必手动将数据强制到这些类属性中。整体$wp_query 对象有一组内部方法,您应该使用这些方法set 价值观下面是一个示例:

public function query( $query )
{
    if (
        \'SOME_POST_TYPE\' !== $query->get( \'post_type\' )
        OR ! $query->is_main_query()
        OR ! $query->is_archive()
        OR ! $query->is_post_type_archive()
        OR ! is_page_template( \'TEMPLATE_NAME.php\' )
    )
        return $query;

    $query->set( \'posts_per_page\', -1 );
    $query->set( \'numberposts\', -1 );

    return $query;
}
内置分类法:类别和;标记单个术语/类别/分类单元如果您想查询类别并手动设置,那么您的任务非常简单,因为don\'t 必须tax_query:

$query->set( \'category__in\', 13 );
如果需要查询多个类别,请执行以下操作:

$query->set( \'category__and\', array( 12, 13 ) );
您可以在Codex page for the WP_Query class. 当然,对于内置post_tag/标记分类法。

自定义分类法(Custom Taxonomy)

这里的事情变得稍微复杂一些:您需要使用tax_query. Keep in mind 这需要array( array() ). 简单地说:一个周围的数组和一个内部的数组。如果不这样做,WP将无声地失败。示例:

$tax_query = array(
    array(
         \'taxonomy\' => \'event_type_taxonomy\'
        ,\'field\'    => \'id\'
        ,\'terms\'    => array( 12, 13 )
        ,\'operator\' =>\'IN\'
    )
);
$query->set( \'tax_query\', $tax_query );
在Codex页面上再次进行扩展解释。

结束

相关推荐