WordPress 文章列表可以按照日期、分類等條件進(jìn)行篩選,除了這些默認(rèn)的篩選條件,我們還可以根據(jù)需要添加自定義篩選條件。添加自定義篩選條件主要使用到了 restrict_manage_posts 和 parse_query 這兩個(gè)鉤子,在本文中,我們來(lái)看一下怎么使用這兩個(gè)鉤子在 WordPress 后臺(tái)添加一個(gè)根據(jù)自定義字段進(jìn)進(jìn)行篩選的自定義篩選條件。添加后,效果如下圖。

第一步:添加過(guò)濾表單項(xiàng)目
第一步,我們需要添加一個(gè)下拉表單到 WordPress 后臺(tái)文章列表。首先我們進(jìn)行一些必要的判斷,然后從 WordPress 數(shù)據(jù)庫(kù)中獲取篩選數(shù)據(jù),最后根據(jù)獲取到的數(shù)據(jù)構(gòu)造一個(gè)下拉選擇表單項(xiàng)目,具體代碼如下,在使用的時(shí)候,需要根據(jù)實(shí)際情況,修改自定義字段或文章類型名稱。
add_action('restrict_manage_posts','cpt_type_filter',10);
function location_filtering($post_type){
if('my-custom-post' === $post_type){
return; // 檢查是否是我們需要的文章類型
}
$selected = '';
$request_attr = 'my_loc';
if ( isset($_REQUEST[$request_attr]) ) {
$selected = $_REQUEST[$request_attr];
}
// 需要篩選的 meta key
$meta_key = 'my_custom_field_location';
// 獲取篩選條件數(shù)據(jù)
global $wpdb;
$results = $wpdb->get_col(
$wpdb->prepare( "
SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status IN ('publish', 'draft')
ORDER BY pm.meta_value",
$meta_key
)
);
// 使用獲取的篩選條件數(shù)據(jù)添加下拉表單
echo '<select id="my-loc" name="my_loc">';
echo '<option value="0">' . __( 'Show all locations', 'my-custom-domain' ) . ' </option>';
foreach($results as $location){
$select = ($result->ID == $selected) ? ' selected="selected"':'';
echo '<option value="'.$location.'"'.$select.'>' . $location . ' </option>';
}
echo '</select>';
}
第二步:添加篩選條件到文章列表查詢參數(shù)中
第一步只是添加了自定義篩選字段表單,我們還需要對(duì)操作表單后的情況做一些處理,才能實(shí)現(xiàn)根據(jù)自定義字段進(jìn)行篩選的功能。具體來(lái)說(shuō)就是獲取表單請(qǐng)求字段,然后獲取到的請(qǐng)求字段值加入到顯示文章列表的查詢參數(shù)中。具體實(shí)現(xiàn)參考以下代碼。
add_filter( 'parse_query', 'filter_request_query' , 10);
function filter_request_query($query){
// 只修改后臺(tái)文章列表頁(yè)面的主查詢
if( !(is_admin() AND $query->is_main_query()) ){
return $query;
}
// 如果不是我們需要查詢的文章類型,并且設(shè)置了自定義查詢參數(shù),返回原始查詢
if( !'my-custom-post' === $query->query['post_type'] or !isset($_REQUEST['my_loc']) ){
return $query;
}
// 如果自定義篩選條件是默認(rèn)值,返回原始查詢
if(0 == $_REQUEST['my_loc']){
return $query;
}
// 修改查詢參數(shù)
$query->query_vars = array(array(
'field' => 'my_custom_field_location',
'value' => $_REQUEST['my_loc'],
'compare' => '=',
'type' => 'CHAR'
));
// 返回修改后的查詢
return $query;
}
完成了上面兩步,我們就可以根據(jù)自定義字段在 WordPress 后臺(tái)文章列表中根據(jù)自定義字段篩選文章了。除了自定義字段,只要是 WP_Query 類支持的參數(shù),理論上我們都可以用作篩選條件添加到 WordPress 后臺(tái)文章列表中,比如根據(jù)文章作者、根據(jù)自定義分類方法,標(biāo)簽等條件進(jìn)行篩選。

