如何为自制PHP开发的WordPress包装插件添加日期与公司筛选器?
给WordPress包装生成插件添加日期与公司筛选功能
1. 前端渲染筛选表单
在插件的管理页面(展示包装列表的后台页面)添加筛选表单,让用户选择目标公司和日期范围:
// 插件列表页面的回调函数示例 function my_packaging_list_page() { // 获取当前筛选参数,用于回显用户选择 $selected_company = isset($_GET['filter_company']) ? sanitize_text_field($_GET['filter_company']) : ''; $start_date = isset($_GET['filter_start_date']) ? sanitize_text_field($_GET['filter_start_date']) : ''; $end_date = isset($_GET['filter_end_date']) ? sanitize_text_field($_GET['filter_end_date']) : ''; ?> <div class="wrap"> <h1>包装列表</h1> <!-- 筛选表单 --> <form method="get" action=""> <!-- 保留当前页面参数,避免跳转丢失上下文 --> <input type="hidden" name="page" value="<?php echo esc_attr($_GET['page']); ?>"> <label for="filter_company">筛选公司:</label> <select name="filter_company" id="filter_company"> <option value="">所有公司</option> <!-- 实际场景中请从数据库/自定义字段动态拉取公司列表,此处为示例硬编码 --> <option value="Company A" <?php selected($selected_company, 'Company A'); ?>>Company A</option> <option value="Company B" <?php selected($selected_company, 'Company B'); ?>>Company B</option> </select> <label for="filter_start_date">开始日期:</label> <input type="date" name="filter_start_date" id="filter_start_date" value="<?php echo esc_attr($start_date); ?>"> <label for="filter_end_date">结束日期:</label> <input type="date" name="filter_end_date" id="filter_end_date" value="<?php echo esc_attr($end_date); ?>"> <input type="submit" class="button button-primary" value="应用筛选"> </form> <!-- 此处渲染你的包装列表 --> <?php $this->render_packaging_list(); ?> </div> <?php }
2. 后端处理筛选逻辑
根据前端传入的参数,修改数据查询条件,分两种存储场景处理:
场景一:包装数据存储为自定义文章类型
如果包装是通过WordPress自定义文章类型(如packaging)存储,公司和日期为文章自定义字段,修改WP_Query参数即可:
function get_filtered_packagings() { $args = array( 'post_type' => 'packaging', 'posts_per_page' => -1, 'meta_query' => array('relation' => 'AND'), ); // 添加公司筛选条件 if (!empty($_GET['filter_company'])) { $args['meta_query'][] = array( 'key' => 'packaging_company', // 对应存储公司的自定义字段键名 'value' => sanitize_text_field($_GET['filter_company']), 'compare' => '=', ); } // 添加日期范围筛选 if (!empty($_GET['filter_start_date']) && !empty($_GET['filter_end_date'])) { $args['meta_query'][] = array( 'key' => 'packaging_created_date', // 对应存储日期的自定义字段键名 'value' => array( sanitize_text_field($_GET['filter_start_date']), sanitize_text_field($_GET['filter_end_date']), ), 'compare' => 'BETWEEN', 'type' => 'DATE', ); } $query = new WP_Query($args); return $query->posts; }
场景二:包装数据存储在自定义数据库表
如果插件使用独立数据库表存储包装数据,用$wpdb执行安全查询:
function get_filtered_packagings_from_custom_table() { global $wpdb; $table_name = $wpdb->prefix . 'packagings'; // 你的自定义表名 $where_clauses = array(); $query_args = array(); // 公司筛选条件 if (!empty($_GET['filter_company'])) { $where_clauses[] = 'company = %s'; $query_args[] = sanitize_text_field($_GET['filter_company']); } // 日期范围筛选条件 if (!empty($_GET['filter_start_date']) && !empty($_GET['filter_end_date'])) { $where_clauses[] = 'created_date BETWEEN %s AND %s'; $query_args[] = sanitize_text_field($_GET['filter_start_date']); $query_args[] = sanitize_text_field($_GET['filter_end_date']); } $where = ''; if (!empty($where_clauses)) { $where = 'WHERE ' . implode(' AND ', $where_clauses); } // 安全执行查询,防止SQL注入 $packagings = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $table_name $where", $query_args) ); return $packagings; }
3. 关键注意事项
- 安全防护: 所有用户输入必须用
sanitize_text_field()、sanitize_date()等函数过滤;自定义表查询必须使用$wpdb->prepare()避免SQL注入。 - 日期格式: 确保前端输入的日期格式与数据库存储格式一致(如MySQL默认的
Y-m-d),格式不匹配时可通过strtotime()或DateTime类转换。 - 动态数据源: 公司选项需从数据库或自定义分类动态拉取,不要硬编码。
- 状态保留: 表单中通过
selected()和value属性回显用户之前的选择,提升使用体验。
内容的提问来源于stack exchange,提问作者Younes Noorzai
相关产品推荐
相关产品推荐

