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

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

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

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

  1. add_action('restrict_manage_posts','cpt_type_filter',10);
  2. function location_filtering($post_type){
  3. 
    
  4.   if('my-custom-post' === $post_type){
  5.     return; // 检查是否是我们需要的文章类型
  6.   }
  7. 
    
  8.   $selected = '';
  9.   $request_attr = 'my_loc';
  10.   if ( isset($_REQUEST[$request_attr]) ) {
  11.     $selected = $_REQUEST[$request_attr];
  12.   }
  13. 
    
  14.    // 需要筛选的 meta key
  15.    $meta_key = 'my_custom_field_location';
  16. 
    
  17.    // 获取筛选条件数据
  18.    global $wpdb;
  19.    $results = $wpdb->get_col(
  20.    $wpdb->prepare( "
  21.      SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
  22.      LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
  23.      WHERE pm.meta_key = '%s'
  24.      AND p.post_status IN ('publish', 'draft')
  25.      ORDER BY pm.meta_value",
  26.      $meta_key
  27.    )
  28.   );
  29. 
    
  30.    // 使用获取的筛选条件数据添加下拉表单
  31.    echo '<select id="my-loc" name="my_loc">';
  32.    echo '<option value="0">' . __( 'Show all locations', 'my-custom-domain' ) . ' </option>';
  33.    foreach($results as $location){
  34.      $select = ($result->ID == $selected) ? ' selected="selected"':'';
  35.      echo '<option value="'.$location.'"'.$select.'>' . $location . ' </option>';
  36.    }
  37.    echo '</select>';
  38. }

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

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

  1. add_filter( 'parse_query', 'filter_request_query' , 10);
  2. function filter_request_query($query){
  3.     // 只修改后台文章列表页面的主查询
  4.     if( !(is_admin() AND $query->is_main_query()) ){
  5.       return $query;
  6.     }
  7.     // 如果不是我们需要查询的文章类型,并且设置了自定义查询参数,返回原始查询
  8.     if( !'my-custom-post' === $query->query['post_type'] or !isset($_REQUEST['my_loc']) ){
  9.       return $query;
  10.     }
  11.     // 如果自定义筛选条件是默认值,返回原始查询
  12.     if(0 == $_REQUEST['my_loc']){
  13.       return $query;
  14.     }
  15.    // 修改查询参数
  16.     $query->query_vars = array(array(
  17.       'field' => 'my_custom_field_location',
  18.       'value' => $_REQUEST['my_loc'],
  19.       'compare' => '=',
  20.       'type' => 'CHAR'
  21.     ));
  22. 
    
  23.     // 返回修改后的查询
  24.     return $query;
  25.   }

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

原创文章,作者:DavidWu,如若转载,请注明出处:https://www.davidwu.net/archives/84480

WordPress安全防护插件
服务项目 服务内容 收费标准(元)
主题/插件汉化 汉化团队WordPress主题/插件,翻译率95% (以标的主题/插件的句子数量为准)
服务器环境配置 基于您现有服务器,搭建配置网站运行环境,结合我们多年来实战经验,可完美支持WordPress等PHP程序运行,并配置伪静态规则、优化目录权限等问题。服务器我们强烈推荐使用Linux系统。 100元/次
网站托管 若贵站目前尚无技术人员,无法完成服务器环境配置,可选择我们的网站托管服务,直接交付正常运行的WordPress站点,并且无需担心服务器的后续维护工作,一切都由我们来帮您完成。 标配套餐:1000元/年/站点 高配套餐:联系客服获取
网站加速优化 从服务器后端配置优化到WordPress数据库缓存、前端页面缓存、JS和CSS压缩合并,全方位优化网站加载速度,实现秒开。(此服务仅针对(云)服务器/VPS) 500元/次(仅站内优化200元/次)
主题配置 本站所有主题均支持,可快速实现,若有任何问题可以咨询客服解决,若您希望我们提供配置服务,可选购此服务。 英文主题安装 60元/次 汉化主题安装 30元/次
HTTPS配置 HTTPS已经不断普及,并且有着更高的安全性以及SEO上的优待。该服务收取的为服务费,SSL证书产生的费用请自行承担。 100元/次
网站搬家 迁移网站所有文件和数据库信息、网站相关配置的调整、以及迁移中的疑难问题故障排除。 标准收费:500元/次 若网站数据量大,需协商
网站运维 提供整站的运维服务,保证网站正常运行。包含:网站故障定位及排除、网站数据备份和恢复、网站攻击及木马等问题的处理等 标准收费:2000元/年 IP 5000以上需协商

发表评论

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

51建站客服微信二维码
点击这里购买