我正在尝试在我的厕所订单页面上添加“按日期范围过滤”。我目前正在使用下面的代码,但是,如果我选择 1 个日期(从 9 月 1 日到 9 月 1 日),它会继续填充我选择的日期之前和之后的其他订单。我做错了什么?
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');
操作钩子没有
woocommerce_order_list_table_restrict_manage_orders
参数,这就是为什么你当前的代码没有显示任何东西。
请注意,
woocommerce_order_list_table_restrict_manage_orders
挂钩仅在启用高性能订单存储(HPOS)时在管理订单列表中可用。由于 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'])) {
$query_args['date_query'][] = array(
'before' => esc_attr($_GET['to_date']),
'inclusive' => true,
);
}
return $query_args;
}
已测试且有效。