自從WordPress添加了自定義文章類(lèi)型功能以來(lái),現(xiàn)在很多網(wǎng)站開(kāi)發(fā)或WordPress主題、插件都會(huì)用到自定義文章類(lèi)型,今天倡萌來(lái)說(shuō)下如何在首頁(yè)、搜索結(jié)果頁(yè)、作者存檔以及Feed訂閱輸出中限制文章類(lèi)型。這里所指的都是WordPress的主循環(huán)(即這些類(lèi)型頁(yè)面默認(rèn)的循環(huán))。
開(kāi)始之前,你可以通過(guò)《實(shí)例講解 WordPress 自定義文章類(lèi)型》專(zhuān)題了解什么是自定義文章類(lèi)型。
注:以下的代碼都可以添加到當(dāng)前主題的functions.php中,或者也可以添加到你自己的插件中。
限定首頁(yè)主循環(huán)的文章類(lèi)型
如果你的首頁(yè)是常規(guī)的博客列表,那這個(gè)方法是有效的。
/**
* 自定義首頁(yè)主循環(huán)的文章類(lèi)型
*/
function wpkj_homepage_pre_get_posts( $query ) {
// 限定首頁(yè)的主循環(huán)
if ( $query->is_home() && $query->is_main_query() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
}
add_action( 'pre_get_posts', 'wpkj_homepage_pre_get_posts', 99, 1 );
限定搜索結(jié)果頁(yè)的文章類(lèi)型
/**
* 自定義搜索結(jié)果頁(yè)面的文章類(lèi)型
*/
function wpkj_search_archive_pre_get_posts( $query ) {
//限定搜索主循環(huán),并且是前臺(tái)頁(yè)面
if ( $query->is_search && $query->is_main_query() && !is_admin() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
}
add_action( 'pre_get_posts', 'wpkj_search_archive_pre_get_posts', 99, 1 );
限定作者存檔頁(yè)的文章類(lèi)型
/**
* 自定義作者存檔頁(yè)的文章類(lèi)型
*/
function wpkj_author_archive_pre_get_posts( $query ) {
//限定是作者存檔的主循環(huán)
if ( $query->is_author() && $query->is_main_query() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
}
add_action( 'pre_get_posts', 'wpkj_author_archive_pre_get_posts', 99, 1 );
限定Feed訂閱輸出的文章類(lèi)型
/**
* 自定義Feed訂閱的文章類(lèi)型
*/
function wpkj_feed_pre_get_posts( $query ) {
//限定是Feed輸出
if ( $query->is_feed() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
}
add_action( 'pre_get_posts', 'wpkj_feed_pre_get_posts', 99, 1 );
將上面的所有功能集成到一個(gè)函數(shù)中
大家仔細(xì)看的上面的函數(shù)代碼,其實(shí)都是同一個(gè)模板,我們可以將他們集中在一個(gè)函數(shù)中:
/**
* 自定義首頁(yè)、搜索、作者存檔、Feed訂閱輸出的文章類(lèi)型
*/
function wpkj_custom_pre_get_posts( $query ) {
// 自定義首頁(yè)主循環(huán)的文章類(lèi)型
if ( $query->is_home() && $query->is_main_query() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
// 自定義搜索結(jié)果頁(yè)面的文章類(lèi)型
if ( $query->is_search && $query->is_main_query() && !is_admin() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
// 自定義作者存檔頁(yè)的文章類(lèi)型
if ( $query->is_author() && $query->is_main_query() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
// 自定義Feed訂閱的文章類(lèi)型
if ( $query->is_feed() && $query->is_main_query() ) {
// 請(qǐng)根據(jù)你的實(shí)際需要,修改下面這個(gè)array數(shù)組的文章類(lèi)型
$post_type = array( 'post', 'product', 'book' );
$query->set( 'post_type', $post_type );
}
}
add_action( 'pre_get_posts', 'wpkj_custom_pre_get_posts', 99, 1 );
當(dāng)然了,上面的函數(shù)還可以精簡(jiǎn),只不過(guò)為了可讀性和靈活性,就不再壓縮了,有能力的朋友可以自己修改。
pre_get_posts 鉤子講解
在上面的代碼中,我們都用到了 pre_get_posts 鉤子,它可以更改 WP_Query 查詢的各種參數(shù),不僅限于文章類(lèi)型 'post_type',還可以是分類(lèi)、每頁(yè)數(shù)量等等,你可以看下《掌握 WP_Query》專(zhuān)題的詳細(xì)介紹,或者查看官方的 WP_Query 文檔。




