获取所有免费送货区域包括默认区域“世界其他地方”

时间:2017-02-15 07:28:30

标签: php wordpress woocommerce shipping zone

我想获得免费送货区域时的所有数据(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 个答案:

答案 0 :(得分: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对象([_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);

Bingo 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 的输出世界其他地方(re-bingo !!!)......

您还可以使用其他WC_DataWC_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 …

答案 1 :(得分: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 '';
            }
        }

    }