2017-02-15 25 views
1

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

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

ответ

3

Я получил ваш ответ после некоторого поиска в этом official thread related to WC 2,6+ and Shipping default Zone, а также в исходном коде WC_Shipping_Zone класса. Вы узнаете, что класс по умолчанию имеет ID = 0.

Я попытался это первый:

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

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

WC_Shipping_Zone Object ([_data: защищенный] => Array ([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())

Bingo 1! данные там и я получаю по умолчанию Доставки зона объекта, но защищена и не доступны через петлю Еогеаспа или что-то еще ...

Если вы посмотрите 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 … 
+0

благодарите свой ответ, но можете ли вы помочь мне получить ** zone_name ** и ** zone_id ** только ** Бесплатная доставка ** метод? – huykon225

+0

Приведите свой ответ. Я нашел способ получить всю ценность. Я отправлю ответ здесь и добавлю свой скайп. Спасибо большое ! – huykon225

+0

Да @LoicTheAztec. Это мне очень помогает. Еще раз спасибо – huykon225

1

благодарю вас за ответ @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 ''; 
      } 
     } 

    } 
+0

Я знаю вашу помощь и ценю ее. Я проголосовал за ваш ответ. – huykon225