如何自定义wordpress主循环查询

在日常使用中,或是在主题开发中,如果没有特定的需要。我们一般都是用的wordpress默认的排序来查询主循环。具体体现就在于我们看到主页、存档页、搜索结果页等默认就是文章按发布时间来排序显示。

如果我们要改变或是要新增查询时,我们常常用到的就是在主循环前添加条件。如下代码:

$loop = new WP_Query( array(
     'posts_per_page' => 5,
     'category_name' => 'spain',
) );

这种情况虽然好用。但需要我们去修改各个有主循环的功能页面。如index.php/archive.php等。这样相对麻烦,用pre_get_posts就能轻松快捷的更改主循环的查询,而不用去每个文件修改。您只需要在functions.php下面加上就行了。下面介绍几种常见的使用场景。

请注意,以下的代码只是例子,具体您要使用的话,请将相关参数更改成您自己的即可。

1.排除特定分类

/**
* Exclude Category from Blog
*/function exclude_category( $query ) {
    if( $query->is_main_query() && ! is_admin() && $query->is_home() ) {
        $query->set( 'cat', '-4' );
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

2.定义每页文章的数量

/**
* Change Posts Per Page
*/function change__posts_per_page( $query ) {
    if( $query->is_main_query() && !is_admin() ) {
      $query->set( 'posts_per_page', '18' );
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

3.按特定文章类型的meta更改查询条件

/**
* Customize portfolio Query using Post Meta
*/function portfolio_query( $query ) {
    if( $query->is_main_query() && !$query->is_feed() && !is_admin() && $query->is_post_type_archive( 'portfolio' ) ) {
        $meta_query = array(
           array(
              'key' => 'manager_end_date',
              'value' => time(),
             'compare' => '>'
             )
         );
         $query->set( 'meta_query', $meta_query );
         $query->set( 'orderby', 'meta_value_num' );
         $query->set( 'meta_key', 'be_events_manager_start_date' );
         $query->set( 'order', 'ASC' );
        $query->set( 'posts_per_page', '4' );
    }
}
add_action( 'pre_get_posts', 'portfolio_query' );

4.更改默认查询的文章类型

默认情况下,主循环只查询文章。如果我们要在主循环主同时显示作品portfolio时,我们可用用下面的代码

/**
*Make portfolio posts show up in archive pages
*/add_action( 'pre_get_posts', 'add_custom_post_types_to_query' );
function add_custom_post_types_to_query( $query ) {
    if( 
       is_archive() && empty( $query->query_vars['suppress_filters'] )
     ) {
    $query->set( 'post_type', array( 
       'post',
       'portfolio'
     ) );
   }
}

5.更改主循环的排序方式

这是用得最多的功能选项,下面用代码来演示

function modify_query_order_index( $query ) {
if ( $query->is_front_page() && $query->is_main_query() && !is_admin() ) {
    $query->set( 'orderby', 'date' );
    $query->set( 'order', 'DESC' );
    $query->set( 'posts_per_page', '4' );
    $query->set( 'post_type', 'post' );
    $query->set( 'tag', 'pics, vids' );
  }
}
add_action( 'pre_get_posts', 'modify_query_order_index' );

在不用修改查询时,使用pre_get_posts是一个非常有用的工具。当修改和现有的查询更简单和更有性能时,它也是防止编写不必要的自定义WP_Querys的绝佳方法。特别是当您需要对WordPress的默认查询进行修改时,对于您的博客主页、存档和搜索页面等页面来说,这一点尤为重要;这时pre_get_posts就变得不可或缺了。

本文已在Ie主题99839发布

文章来源:https://ietheme.com/customize-the-wordpress-query.html


撰写评论

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

加入我们

注册完成!

密码重置

请输入您的邮箱地址。 您将收到一个链接来创建新密码。

检查你的邮件中的确认链接。