跳至内容
WordPress-Pre-get-posts-filter

WordPress开发:自定义默认循环Main Query

在进行WordPress开发的时候,我们经常要去自定义一些参数,比如说把一些文章排除,今天SEO禅就来分享下,如何自定义主循环Main Query,我们在刚开始开发WordPress,所有的主题模板一定会有下面这段代码:

if ( have_posts() ) {
    while ( have_posts() ) {
 
        the_post(); ?>
 
        <h2><?php the_title(); ?></h2>
 
        <?php the_content(); ?>
 
    <?php }
}

WP_Query对象

这是WordPress默认的主循环查询,在访问网站的时候,WordPress程序会根据一些默认的参数设置,查询出一些内容,之后把这些数据装载到全局变量$wp_query中,wp_query对象是在WordPress开发中最重要的一个研究对象,比如我们看看the_post()这个全局函数的源代码:

function the_post() {
    global $wp_query;
    $wp_query->the_post();
}

其实这个函数内部也是直接调用了$wp_query对象中的the_post方法,所有我们使用的the_content这些函数也只是一些语法糖,方便我们调用而已,真正做事的还是WP_Query,看看下面这张图:

wp_query-function-lifecycle
WP_Query对象解析

pre_get_posts自定义

上面讲了这么多,还没说到如何实际去自定义这个主循环,自定义的方法肯定不止一种,这里只介绍SEO禅认为最合理的一种,那就是pre_get_posts hook,这个过滤钩子是在执行实际查询前生效,把查询条件自定义后返回,再继续进行实际的查询,下面就拿SEO禅博客举例,在SEO禅V2.0版本中,有一个所见所闻所想模块,这个模块的内容是平时SEO禅个人的所见所闻所想,但是这块内容也会出现在主循环上,主循环只想有和SEO优化有关的内容,所以就要想办法把他们去除掉,看下面的代码:

// 从主查询中移除所见所闻所想文章
function remove_isee_ihear_ithink_posts_from_main_query($query)
{
    if ( $query->is_front_page() && $query->is_main_query()) {
        $query->set('tax_query',array(
            array(
                'taxonomy' => 'category',
                'field'    => 'slug',
                'terms'    => 'isee-ihear-ithink',
                'operator' => 'NOT IN',
            ),
        ));
    }
}
add_action('pre_get_posts', __NAMESPACE__ . '\\remove_isee_ihear_ithink_posts_from_main_query');

category有直接排除的参数,但是使用的是id作为条件,SEO禅比较懒,不想去查id,因为slug别名是自己设置的肯定比较熟悉,就直接使用别名好了,但是没有现成的参数支持,那我们就使用tax_query组一个,具体的参数可以查看WP_Query中的tax_query部分,上面的__NAMESPACE__ 是因为SEO禅使用的是Laravel来开发的WordPress,你们自己的就按平时的写法就行。这里只是简单的举个例子,自己可以去看看文档,根据自己的实际需求进行调整。

作者:SEO禅
本文链接:WordPress开发:自定义默认循环Main Query
版权申明:如无特殊说明,本站文章均为作者原创,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处,谢谢!

标签:,

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注