Я хочу отфильтровать список заказов WooCommerce в соответствии с метаданными пользователя. Продуктами являются какие-то подписки, работающие на период 12 месяцев.
Когда клиент заказывает продукт (подписку), начальная дата подписки сохраняется в пользовательском meta_key, например, international_subscription_start_date
,
Теперь я хочу показать все заказы, которые имеют international_subscription_start_date
старше 11 месяцев
Я успешно установил выпадающий список:
add_action('restrict_manage_posts','add_subscription_filter_to_shop_order_posts_administration');
function add_subscription_filter_to_shop_order_posts_administration(){
global $post_type;
if($post_type == 'shop_order'){
$values = array(
'Inter. Subs < 1M' => 'international_subscription_start_date_lt_1M',
'DE. Subs < 1M' => 'germany_subscription_start_date_lt_1M',
'All Subs < 1M' => 'pvm_all_substriprions_lt_1M',
'Inter. Subs' => 'international_subscription_start_date',
'DE. Subs' => 'germany_subscription_start_date',
'All Subs' => 'pvm_all_substriprions'
);
?>
<select name="subscriptions_admin_filter">
<option value=""><?php _e('All Orders', 'pv-mag'); ?></option>
<?php
$current_v = isset($_GET['subscriptions_admin_filter']) ? $_GET['subscriptions_admin_filter'] : '';
foreach ($values as $label => $value) {
printf
(
'<option value="%s"%s>%s</option>',
$value,
$value == $current_v ? ' selected="selected"' : '',
$label
);
}
?>
</select>
<?php
}
}
Сейчас в pre_get_posts
Я делаю следующее:
add_action('pre_get_posts','add_subscriptions_filter_to_shop_order_page');
function add_subscriptions_filter_to_shop_order_page($query){
global $post_type, $pagenow;
if($pagenow == 'edit.php' && $post_type == 'shop_order'){
if(isset($_GET['subscriptions_admin_filter']) && $_GET['subscriptions_admin_filter'] != ''){
$today_minus_11_month = date('Y-m-d', strtotime('-11 month'));
$today_plus_11_month = date('Y-m-d', strtotime('+11 month'));
$subs_type = $_GET['subscriptions_admin_filter'];
switch ($subs_type) {
case 'international_subscription_start_date_lt_1M':
$subs_typeA = 'international_subscription_start_date';
$subs_typeB = 'international_subscription_start_date';
$date_comp = $today_minus_11_month;
break;
case 'germany_subscription_start_date_lt_1M':
$subs_typeA = 'germany_subscription_start_date';
$subs_typeB = 'germany_subscription_start_date';
$date_comp = $today_minus_11_month;
break;
case 'pvm_all_substriprions_lt_1M':
$subs_typeA = 'international_subscription_start_date';
$subs_typeB = 'germany_subscription_start_date';
$date_comp = $today_minus_11_month;
break;
case 'international_subscription_start_date':
$subs_typeA = 'international_subscription_start_date';
$subs_typeB = 'international_subscription_start_date';
$date_comp = $today_plus_11_month;
break;
case 'germany_subscription_start_date':
$subs_typeA = 'germany_subscription_start_date';
$subs_typeB = 'germany_subscription_start_date';
$date_comp = $today_plus_11_month;
break;
case 'pvm_all_substriprions':
$subs_typeA = 'international_subscription_start_date';
$subs_typeB = 'germany_subscription_start_date';
$date_comp = $today_plus_11_month;
break;
default:
break;
};
$meta_query = $query->get('meta_query');
if( empty($meta_query) ) $meta_query = array();
$meta_query[] = array(
'relation' => 'OR',
array(
'key' => $subs_typeA,
'value' => $date_comp,
'compare' => '<=',
'type' => 'DATE'
),
array(
'key' => $subs_typeB,
'value' => $date_comp,
'compare' => '<=',
'type' => 'DATE'
)
);
$query->set('meta_query',$meta_query);
//$query->set('suppress_filters', true);
//$query->set('post_type', 'shop_order');
}
}
}
Когда я применяю фильтр, порядок не отображается. Когда я проверяю запрос (var_dump
) параметры meta_query передаются правильно.
Задача ещё не решена.
Других решений пока нет …