在 WooCommerce 管理订单列表中添加日期范围过滤器(启用 HPOS 时)

问题描述 投票:0回答:1

我正在尝试在管理 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 日),它会不断填充我选择的日期之前和之后的其他订单。我做错了什么?

php woocommerce admin hook-woocommerce orders
1个回答
0
投票

首先请注意,

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; }

已测试且有效。

© www.soinside.com 2019 - 2024. All rights reserved.