You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.10 03:14:51