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