WordPress 有一個(gè)的文章置頂功能,可以讓我們把指定的文章放在頁面最前面。在做一個(gè)WordPress主題開發(fā)的時(shí)候,我們遇到了需要把一個(gè)分類的子分類放在父級分類最前面的功能,和文章置頂功能有點(diǎn)類似。
WordPress 默認(rèn)是沒有分類置頂功能的,是否可以通過代碼為添加分類置頂?shù)墓δ艿?WordPress 中呢?我們研究了一下,發(fā)現(xiàn)是可以的,實(shí)現(xiàn)方法也不麻煩。
給 WordPress 添加分類置頂功能
首先,我們知道,WordPress 的置頂文章信息是存儲在 wp_options 數(shù)據(jù)表中的,通過get_option('sticky_posts') 函數(shù)獲取置頂文章。
我們只需要想辦法給分類添加一個(gè)置頂文章的設(shè)置,然后在保存分類的時(shí)候把這個(gè)設(shè)置保存在數(shù)據(jù)中即可。如下圖,下面的 “Mark this cateogry as featured” 是一個(gè)自定義分類法字段,實(shí)現(xiàn)方法有很多,在這里就不在多說了。

我們需要在保存分類法的同時(shí),保存分類置頂信息到 wp_options 數(shù)據(jù)庫中。把保存置頂信息的處理流程掛載到 edited_category 動(dòng)作鉤子上面即可實(shí)現(xiàn)。
add_action( 'edited_category', function ( $term_id, $tt_id )
{
// 獲取分類置頂設(shè)置信息
$is_featured = isset( $_POST[ '_featured' ] );
// 獲取已保存的分類置頂信息
$featured_term = get_option( 'featured_term', [] );
// 如果當(dāng)前分類設(shè)置了置頂,把當(dāng)前分類 ID 添加到分類置頂設(shè)置中
if ( $is_featured && $is_featured == 'yes' ) {
$featured_term [] = $term_id;
} else {
// 如果當(dāng)前分類沒有設(shè)置置頂,并且分類置頂設(shè)置中有當(dāng)前分類(之前添加過,現(xiàn)在取消了),
// 則從分類置頂設(shè)置中移除當(dāng)前分類
$featured_index = array_search( $term_id, $featured_term );
if ( $featured_index !== false ) {
unset( $featured_term[ $featured_index ] );
}
}
// 去重,保存更新后的數(shù)據(jù)到分類置頂設(shè)置中
update_option( 'featured_term', array_unique( $featured_term ) );
}, 10, 2 );
在前端調(diào)用置頂?shù)姆诸?/h2>
有了分類置頂?shù)男畔?,獲取置頂分類就簡單多了,直接通過下面的代碼調(diào)用即可,如果需要排除置頂?shù)姆诸?,把下面代碼中的 include 換成 exclude 即可。
$featured_terms = get_option('featured_term');
$terms = get_terms( [
'taxonomy' => 'category',
'include' => $featured_terms,
] );
不只是分類目錄,標(biāo)簽、自定義分類法都可以通過類似的方法添加置頂功能,只需要把置頂數(shù)據(jù)保存到適當(dāng)?shù)脑O(shè)置中即可,WordPress Hook 系統(tǒng) 是一個(gè)非常靈活強(qiáng)大的功能,恰當(dāng)?shù)睦?,我們可以?WordPress 增加各種個(gè)樣的功能來滿足我們的需求。


