Получение всех зон бесплатной доставки, включая Зону по умолчанию & quot; Остальной мир & quot;

Я хочу получить все данные (zone_name, zone_id), когда есть бесплатная зона доставки. Я использовал :

$delivery_zones = WC_Shipping_Zones::get_zones();
foreach ((array) $delivery_zones as $key => $the_zone ) {
echo $the_zone['zone_name'];
}
print_r($delivery_zones);

но он всегда возвращает результат без Остальной мир . Как я могу получить все данные со всеми Зоны бесплатной доставки ?

1

Решение

Я получил ваш ответ после некоторого поиска в этом официальная тема, связанная с WC 2,6+ и зоной доставки по умолчанию а также в исходном коде WC_Shipping_Zone учебный класс. Вы узнаете, что класс по умолчанию имеет ID = 0.

Я попробовал это первым:

$default_zone = new WC_Shipping_Zone(0);
print_r($default_zone);

И я получил этот массив:

WC_Shipping_Zone Object ([_data: protected] => Массив ([zone_id] => 0
[zone_name] => Остальной мир [zone_order] => 0 [zone_locations] => Array ()) [_locations_changed: WC_Shipping_Zone: private] => [_cache_group: protected] => [_meta_type: protected] => пост [object_id_field_for_meta: protected] => [_meta_data: protected ] => Array () [_internal_meta_keys: protected] => Array ())

Бинго 1! данные есть и я получаю объект зоны доставки по умолчанию, но это защищенный а также не доступный через цикл foreach или что-то еще …

Если вы посмотрите на WC_Shipping_Zone ты видишь это продолжается WC_Data учебный класс.
Поэтому я попытался использовать методы WC_Data с этим объектом следующим образом:

$default_zone = new WC_Shipping_Zone(0);
$default_zone_data = $default_zone->get_data();
print_r($default_zone_data);

Бинго 2 !!! он выводит массив sam, но на этот раз он не защищен и недоступен.

Итак, ответ:

$default_zone = new WC_Shipping_Zone(0);
$default_zone_data = default_zone->get_data();

$default_zone_id = $default_zone_data->zone_id;
$default_zone_order = $default_zone_data-> zone_order;
$default_zone_locations = $default_zone_data-> zone_locations;
$default_zone_meta_data = $default_zone_data-> meta_data;

// AND TO FINISH THE THE NAME!!!
$default_zone_name = $default_zone_data->zone_name;

echo $default_zone_name

Выход из echo $default_zone_name является Остальной мир (Ребинго !!!)…

Вы можете использовать и другие WC_Data а также WC_Shipping_Zone Способы получения необходимых данных:

$default_zone = new WC_Shipping_Zone(0);
$default_zone_formatted_location = $default_zone->get_formatted_location();
$default_zone_shipping_methods$ = default_zone->get_shipping_methods();

// And so on …
3

Другие решения

спасибо за ответ @LoicTheAztec. Прочитав его ответ, я нашел способ, чтобы привести. вот все:

    $zones = array();

// Rest of the World zone
$zone                                                   = new \WC_Shipping_Zone( 0 );
$zones[$zone->get_zone_id()]                            = $zone->get_data();
$zones[$zone->get_zone_id()]['formatted_zone_location'] = $zone->get_formatted_location();
$zones[$zone->get_zone_id()]['shipping_methods']        = $zone->get_shipping_methods();

// Add user configured zones
$zones = array_merge( $zones, WC_Shipping_Zones::get_zones() );
foreach ( $zones as $each_zone ) {
$zone_name            = $each_zone['zone_name'];
$shipping_methods     = $each_zone['shipping_methods'];
$arr_shipping_methods = json_decode( json_encode( $shipping_methods ), true );
foreach ( $arr_shipping_methods as $free_shipping ) {
if ( $free_shipping['id'] == 'free_shipping' ) {
$zone_id = $each_zone['zone_id'];
} else {
echo '';
}
}

}
1

По вопросам рекламы [email protected]