Получение всех зон бесплатной доставки включает зону по умолчанию "Остальной мир"

Я хочу получить все данные (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 '';
            }
        }

    }
Другие вопросы по тегам