WordPress 后台文章列表中添加自定义字段过滤筛选条件

WordPress 后台文章列表中添加自定义字段过滤筛选条件

WordPress 后台文章列表中添加自定义字段过滤筛选条件

WordPress 文章列表可以按照日期、分类等条件进行筛选,除了这些默认的筛选条件,我们还可以根据需要添加自定义筛选条件。添加自定义筛选条件主要使用到了 restrict_manage_posts 和 parse_query 这两个钩子,在本文中,我们来看一下怎么使用这两个钩子在 WordPress 后台添加一个根据自定义字段进进行筛选的自定义筛选条件。

第一步:添加过滤表单项目

第一步,我们需要添加一个下拉表单到 WordPress 后台文章列表。首先我们进行一些必要的判断,然后从 WordPress 数据库中获取筛选数据,最后根据获取到的数据构造一个下拉选择表单项目,具体代码如下,在使用的时候,需要根据实际情况,修改自定义字段或文章类型名称。

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';

   // 获取筛选条件数据
   global $wpdb;
   $result = $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
   ) 
  );

   // 使用获取的筛选条件数据添加下拉表单
   echo '<select id="my-loc" name="my_loc">';
   echo '<option value="0">' . __( 'Show all locations', 'my-custom-domain' ) . ' </option>';
   foreach($results as $location){
     $select = ($org->ID == $selected) ? ' selected="selected"':'';
     echo '<option value="'.$location.'"'.$select.'>' . $location . ' </option>';
   }
   echo '</select>';
}

第二步:添加筛选条件到文章列表查询参数中

第一步只是添加了自定义筛选字段表单,我们还需要对操作表单后的情况做一些处理,才能实现根据自定义字段进行筛选的功能。具体来说就是获取表单请求字段,然后获取到的请求字段值加入到显示文章列表的查询参数中。具体实现参考以下代码。

add_filter( 'parse_query', 'filter_request_query' , 10);
function filter_request_query($query){
    // 只修改后台文章列表页面的主查询
    if( !(is_admin() AND $query->is_main_query()) ){ 
      return $query;
    }
    // 如果不是我们需要查询的文章类型,并且设置了自定义查询参数,返回原始查询
    if( !'my-custom-post === $query->query['post_type'] or !isset($_REQUEST['my_loc']) ){
      return $query;
    }
    // 如果自定义筛选条件是默认值,返回原始查询
    if(0 == $_REQUEST['my_loc']){
      return $query;
    }
   // 修改查询参数
    $query->query_vars = array(array(
      'field' => 'my_custom_field_location',
      'value' => $_REQUEST['my_loc'],
      'compare' => '=',
      'type' => 'CHAR'
    ));

    // 返回修改后的查询
    return $query;
  }

完成了上面两步,我们就可以根据自定义字段在 WordPress 后台文章列表中根据自定义字段筛选文章了。除了自定义字段,只要是 WP_Query 类支持的参数,理论上我们都可以用作筛选条件添加到 WordPress 后台文章列表中,比如根据文章作者、根据自定义分类方法,标签等条件进行筛选。

本站提供 WordPress 主题定制开发服务

本站长期承接 WordPress 主题、插件、基于 WooCommerce 的商店商城开发业务。 我们有 8 年 WordPress 开发经验,如果你想 用 WordPress 开发网站, 请联系 QQ: 470266798,或邮箱: 4626395@gmail.com 咨询。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*