在前端展示中,我們頁面或者是菜單里有許多的分類目錄。然后點擊分類目錄,進(jìn)入到我們想看的分類里。但是管理這些分類目錄的先后順序 Wordpress 并不支持,但是我們有需求,把 ABC 三個分類做先后排序、這里簡單 demo 記錄下。
- 后臺管理需要添加一個自定義字段,來記錄排序值。
需要用到鉤子category_edit_form_fields / category_add_form_fields和函數(shù)update_term_meta
在當(dāng)前主題下的 functions.php 里掛上自己的表單
// 分類編輯字段 這個函數(shù)名可以隨意更改,但是需要和鉤子里寫的一致。
function mbt_edit_category_field($tag)
{
echo '<tr class="form-field">
<th scope="row"><label for="cat-num">排序</label></th>
<td>
<input name="_term_order" id="cat-num" type="text" value="';
// echo (!empty($tag->term_group)) ? $tag->term_group : '0';
echo (get_term_meta( $tag->term_id, 'cate_order', true )) ? get_term_meta( $tag->term_id, 'cate_order', true ) : 0;
echo '" size="40"/><br>
<span class="cat-num">' . $tag->name . ' 的專題排序</span>
</td>
</tr>';
}
// category_edit_form_fields 意思就是在創(chuàng)建分類字段的時候, 需要執(zhí)行 mbt_edit_category_field 這個函數(shù)。
add_action('category_edit_form_fields', 'mbt_edit_category_field', 10, 2);
- 后臺表單添加好了,但是需要把表單提交的信息寫到數(shù)據(jù)表里。
就用到了另外一個鉤子edited_category / created_category
// 保存數(shù)據(jù) 。方法名不唯一,但是需要和鉤子里的一致。
function mbt_taxonomy_metadate($term_id)
{
// add_term_meta();
update_term_meta($term_id, 'cate_order', $_POST['_term_order']);
// 雖然要兩個鉤子,但是我們可以兩個鉤子使用同一個函數(shù) , 這是.
因為 update_term_meta 的特有機(jī)制,有則更新,無則插入。
}
add_action('created_category', 'mbt_taxonomy_metadate', 10, 1);
add_action('edited_category', 'mbt_taxonomy_metadate', 10, 1);
- 下面就是需要查詢的時候,運(yùn)用上我們的排序字段
cate_order了。
$args = array(
'taxonomy' => 'category', // 根據(jù)你的分類模塊填寫,不一定是 category
'orderby' => 'meta_value_num', // 指定排序字段是 meta_value 里的值
'order' => 'DESC', // 倒敘
'hide_empty' => $hide_empty,
'hierarchical' => 1,
'parent' => $term_id, // 分類id
'meta_query' => array( // 下面的查詢條件就像是 mysql 的 join
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => 'cate_order', // 這里指定用哪個meta_key
'type' => 'NUMERIC',
), array(
// 可以看出這個和上面是查詢關(guān)系是 OR
// 考慮到我們新增分類排序的時候,已經(jīng)有很多分類了,
// 但是都沒有設(shè)置 cate_order 這個排序字段信息
// 如果不加這個判斷,那么沒有排序信息的分類將不會被查出
'key' => 'cate_order',
'compare' => 'NOT EXISTS',
)
),
// 和分類排序沒有關(guān)系了
// 演示怎么和分類排序一起。做條件并列過濾。
array(
'key' => 'cate_status',
'value' => 'ENABLED'
),
),
);
var_dump(get_categories($args));