Получение всех зон бесплатной доставки включает зону по умолчанию "Остальной мир"
Я хочу получить все данные (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);
но он всегда возвращает результат без остального мира. Как я могу получить все данные во всех зонах бесплатной доставки?
2 ответа
Я получил ваш ответ после некоторого поиска в официальной теме, связанной с 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] => post [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 …
Спасибо за ответ @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 '';
}
}
}