我正在尝试在管理 WooCommerce 订单列表上添加“按日期范围过滤”。我目前正在使用以下代码:
function ts_add_date_range_filter($post_type) {
if ('shop_order' === $post_type) {
?>
<label for="from_date"><?php _e('From Date:', 'woocommerce'); ?></label>
<input type="date" id="from_date" name="from_date" value="<?php echo isset($_GET['from_date']) ? esc_attr($_GET['from_date']) : ''; ?>" />
<label for="to_date"><?php _e('To Date:', 'woocommerce'); ?></label>
<input type="date" id="to_date" name="to_date" value="<?php echo isset($_GET['to_date']) ? esc_attr($_GET['to_date']) : ''; ?>" />
<?php
}
}
add_action('woocommerce_order_list_table_restrict_manage_orders', 'ts_add_date_range_filter');
function ts_filter_orders_by_date_range($vars) {
if (!isset($vars['date_query'])) {
$vars['date_query'] = array();
}
if (isset($_GET['from_date']) && !empty($_GET['from_date'])) {
$vars['date_query'][] = array(
'after' => sanitize_text_field($_GET['from_date']),
'inclusive' => true,
);
}
if (isset($_GET['to_date']) && !empty($_GET['to_date'])) {
$vars['date_query'][] = array(
'before' => sanitize_text_field($_GET['to_date']),
'inclusive' => true,
);
}
return $vars;
}
add_filter('woocommerce_order_list_table_prepare_items_query_args', 'ts_filter_orders_by_date_range');
但是,如果我选择 1 个日期(从 9 月 1 日到 9 月 1 日),它会不断填充我选择的日期之前和之后的其他订单。我做错了什么?
首先请注意,
woocommerce_order_list_table_restrict_manage_orders
挂钩仅在启用高性能订单存储(HPOS)时在管理订单列表中可用。
此外,对于 woocommerce_order_list_table_restrict_manage_orders
操作钩子,没有
$post_type
可用参数,**所以 $post_type
未在 IF 语句中定义。那么您当前的代码不应显示任何内容。由于
HPOS 使用自己的 WooCommerce 自定义数据库表,而不再是 WordPress Post 表,没有帖子类型,而只是一个 订单类型。
尝试以下方法:不存在您所描述的问题: 在筛选日期范围内的订单时,所选订单既不是该日期范围之前的 1 天,也不是该日期范围之后的 1 天。所选日期范围准确,仅有效显示相关匹配订单。
add_action('woocommerce_order_list_table_restrict_manage_orders', 'add_wc_orders_date_range_filter', 15);
function add_wc_orders_date_range_filter() {
?>
<label for="from_date"><?php esc_html_e('From Date:', 'woocommerce'); ?></label>
<input type="date" id="from_date" name="from_date" value="<?php echo isset($_GET['from_date']) ? esc_attr($_GET['from_date']) : ''; ?>" />
<label for="to_date"><?php esc_html_e('To Date:', 'woocommerce'); ?></label>
<input type="date" id="to_date" name="to_date" value="<?php echo isset($_GET['to_date']) ? esc_attr($_GET['to_date']) : ''; ?>" />
<?php
}
add_filter('woocommerce_order_list_table_prepare_items_query_args', 'process_wc_orders_from_date_range_filter');
function process_wc_orders_from_date_range_filter( $query_args ) {
if ( !isset($query_args['date_query']) ) {
$query_args['date_query'] = array();
}
if ( isset($_GET['from_date']) && !empty($_GET['from_date']) ) {
$query_args['date_query'][] = array(
'after' => esc_attr($_GET['from_date']),
'inclusive' => true,
);
}
if ( isset($_GET['to_date']) && !empty($_GET['to_date']) ) {
$query_args['date_query'][] = array(
'before' => $to_date,
'inclusive' => esc_attr($_GET['to_date']),
);
}
return $query_args;
}
已测试且有效。