这是该函数,它使我能够在前端(我的帐户)中为 WooCommerce 订单按日期字段创建过滤器。它正在工作,但是当我选择没有订单的日期时,过滤器字段消失并且无法再次过滤,我必须手动从 URL 中删除添加的参数。
我想实现以下目标:当没有订单时,过滤器字段必须仍然可见,以便能够选择不同的日期,并且还必须出现重置按钮来重置过滤器。
这是我当前的代码:
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', 'add_form');
function add_form($has_orders)
{
if ($has_orders) {
$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' ) . '">
</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;
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。