WooCommerce我的账户订单日期筛选优化:保留筛选栏并添加重置按钮
修复WooCommerce我的账户订单日期筛选问题
针对你遇到的「无订单时筛选字段消失」和「缺少重置按钮」问题,以下是修改后的完整代码:
修改说明
- 移除表单显示的
$has_orders判断,确保无论是否有订单都显示筛选字段 - 给日期输入框添加回显逻辑,保留用户已选择的日期
- 添加重置按钮,一键清空筛选参数
- 优化查询逻辑,仅当存在有效日期参数时才添加日期筛选,避免空参数干扰正常订单查询
add_action('woocommerce_before_account_orders', 'add_order_date_filter_form'); function add_order_date_filter_form() { // 获取当前已选的日期参数 $start_date = isset($_GET['start_date']) ? esc_attr($_GET['start_date']) : ''; $end_date = isset($_GET['end_date']) ? esc_attr($_GET['end_date']) : ''; // 生成重置URL:移除start_date和end_date参数 $reset_url = remove_query_arg(array('start_date', 'end_date'), wc_get_account_endpoint_url('orders')); echo '</form> <form action="#" method="get"> <input type="date" name="start_date" value="' . $start_date . '"> <input type="date" name="end_date" value="' . $end_date . '"> <input type="submit" value="' . esc_attr__( 'Filter by date', 'your-text-domain' ) . '"> <a href="' . esc_url($reset_url) . '" class="button">' . esc_attr__( 'Reset Filter', 'your-text-domain' ) . '</a> </form>'; } add_filter( 'woocommerce_my_account_my_orders_query', 'custom_filter_my_account_orders_by_date', 10, 1); function custom_filter_my_account_orders_by_date($query_args) { // 仅当两个日期参数都存在且不为空时,添加日期筛选 if ( isset($_GET['start_date']) && !empty($_GET['start_date']) && isset($_GET['end_date']) && !empty($_GET['end_date'])){ $start_date = sanitize_text_field($_GET['start_date']); $end_date = sanitize_text_field($_GET['end_date']); $query_args['date_query'] = array( array( 'after' => $start_date, 'before' => $end_date, 'inclusive' => true, ), ); } return $query_args; }
细节解析
表单显示优化:
- 直接移除原代码中
if ($has_orders)的判断,确保筛选表单始终可见 - 通过
$_GET获取已选日期并赋值给输入框value,实现筛选状态回显 - 使用
remove_query_arg生成重置链接,点击后跳转到无筛选参数的订单页面
- 直接移除原代码中
查询逻辑优化:
- 增加
!empty()判断,仅当两个日期参数都有效时才添加日期查询条件 - 用
sanitize_text_field处理用户输入的日期,避免潜在安全风险 - 保留
inclusive参数,确保日期范围包含起始和结束当天的订单
- 增加
内容的提问来源于stack exchange,提问作者Gelebrin7
相关产品推荐
相关产品推荐

