这是一个函数,它使我能够在前端(我的帐户)中为WooCommerce订单创建按日期过滤字段.它是有效的,但是当我 Select 没有订单的日期时,过滤字段消失,并且没有办法再次过滤,我必须手动从URL中删除添加的参数.

我想实现以下目标:当没有订单时,过滤器字段必须仍然可见,才能 Select 不同的日期,还必须出现重置按钮,这将重置过滤器.

以下是我当前的代码:

add_action('woocommerce_before_account_orders', 'add_form');
function add_form($has_orders)
{   
    if ($has_orders) {   
        echo 
        '</form>
        <form action="#" method="get">          
        <input type="date" name="start_date">
        <input type="date" name="end_date">
        <input type="submit" value="' . esc_attr__( 'Filter by date', 'your-text-domain' ) . '">
        </form>';       
    }
}
    
add_filter( 'woocommerce_my_account_my_orders_query', 'custom_woocommerce_my_account_my_orders_query', 10, 1);
function custom_woocommerce_my_account_my_orders_query($array) {
    $start_date='';
    $end_date='';
    if ( isset($_GET['start_date']) && isset($_GET['end_date'])){
        $start_date = $_GET['start_date'];
        $end_date = $_GET['end_date'];
    }
    $array['date_query'] = array(
        array(
            'after'  => $start_date, //start_date 2021-11-16
            'before' => $end_date, //end_date
            'inclusive' => true,
        ),
    );
    return $array;
}

推荐答案

由于WooCommerce订单查询使用的是WC_Order_Query,所以您需要一些不同的东西:

add_action('woocommerce_before_account_orders', 'filter_myaccount_orders');
function filter_myaccount_orders($has_orders){   
    if ($has_orders || isset($_GET['start_date']) || isset($_GET['end_date']) ) {
        $start_date = $end_date = ''; // Initializing;
        if ( isset($_GET['start_date']) && ! empty($_GET['start_date']) ) {
            $start_date = esc_attr($_GET['start_date']);
        }
        if ( isset($_GET['end_date']) && ! empty($_GET['end_date']) ) {
            $end_date = esc_attr($_GET['end_date']);
        }

        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' ) . '">';
        if( isset($_GET['start_date']) || isset($_GET['end_date']) ) {
            $myaccount_orders_url = get_permalink( get_option('woocommerce_myaccount_page_id') ) . 'orders/';
            echo '<a class="button reset" href="'.$myaccount_orders_url.'">'.__('Reset').'</a>';
        }
        echo '</form>';       
    }
}

add_filter( 'woocommerce_my_account_my_orders_query', 'custom_my_account_orders', 10, 1 );
function custom_my_account_orders( $args ) {
    $start_date = $end_date = '';// Initializing;
        
    if ( isset($_GET['start_date']) && ! empty($_GET['start_date']) ) {
        $start_date = esc_attr($_GET['start_date']);
    }
    if ( isset($_GET['end_date']) && ! empty($_GET['end_date']) ) {
        $end_date = esc_attr($_GET['end_date']);
    }

    if ( $start_date && ! $end_date ) {
        $args['date_created'] = '>='.$start_date;
    } elseif ( ! $start_date && $end_date ) {
        $args['date_created'] = '<='.$end_date;
    } elseif ( $start_date && $end_date ) {
        $args['date_created'] = $start_date.'...'.$end_date;
    }
    return $args;
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

Php相关问答推荐

WooCommerce中仅在单一产品和产品档案页面中将小数设置为大写

PHP如何将ARRAY_MAP与Reset()配合使用

将产品类别添加到WooCommerce产品附加信息

将部分产品排除在WooCommerce的计算附加费之外

如何不重新查询模型A-&>;相关模型B-&>模型

在PHP中使用curl命令执行SCRAPYD操作.json不返回任何内容

是否使用联系人表单7 wpcf7_Feedback_Response输出答复中的html?

在WooCommerce中以编程方式添加特定产品后,将价格设置为零

API 平台 - UI 服务器端点定义

产品页面自定义复选框可对 WooCommerce 购物车小计启用百分比折扣

在 php 中生成 MAC ISO/IEC 9797-1

无法使用 slim 的父级容器

设置GA4 PHP API的setSubject以允许访问所有管理员账户属性

Shopware 6.4.20店铺激活问题

ACF 更新字段功能不更新 WordPress 中的任何数据

在 Laravel、Vuejs 和 Inertia 中配置 TypeScript 的问题

PHP 日期格式:ISO8601 与 ISO8601_EXPANDED

输出每个可能的产品选项

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

Laravel - 关联与设置观察者事件的 ID