我正在尝试在管理 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
可用参数,因此您当前的代码不应显示任何其他字段,以按日期范围过滤订单。 由于 HPOS
使用自己的 WooCommerce 自定义表,而不再是 WordPress 帖子表,没有帖子类型,而只是一个 订单类型。
解决您的问题: 您只需通过第二个函数(即处理请求)向“截止日期”值添加一天即可。
尝试以下方法:
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']) ) {
// Add one day
$to_date = date('Y-m-d', strtotime( esc_attr($_GET['to_date']) ) + 86400 );
$query_args['date_query'][] = array(
'before' => $to_date,
'inclusive' => true,
);
}
return $query_args;
}
已测试且有效。