在日常使用中,或是在主题开发中,如果没有特定的需要。我们一般都是用的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