【问题标题】:Getting all Free Shipping Zones include the default Zone "Rest of the World"获取所有免费送货区域包括默认区域“世界其他地区”
【发布时间】:2017-07-03 17:49:17
【问题描述】:

我想在有免费送货区域时获取所有数据(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);

但它总是返回没有 Rest of the World 的结果。如何获取所有免费送货区域的所有数据?

【问题讨论】:

    标签: php wordpress woocommerce shipping zone


    【解决方案1】:

    official thread related to WC 2,6+ and Shipping default ZoneWC_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] = > 数组 () ) [_locations_changed:WC_Shipping_Zone:private] => [_cache_group:protected] => [_meta_type:protected] => 发布 [object_id_field_for_meta:protected] => [_meta_data:protected] => 数组 () [_internal_meta_keys:protected ] => 数组 ( ) )

    宾果游戏 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 的输出是 Rest of the World(重新宾果游戏!!!)...

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

    【讨论】:

    • 感谢您的回答,但您能帮我获得 zone_namezone_idFree Shipping 方法吗?
    • 感谢您的回答。我找到了获得所有价值的方法。我将在这里发布答案并添加您的Skype。非常感谢!
    【解决方案2】:

    感谢@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 '';
                }
            }
    
        }
    

    【讨论】:

    • 我知道您的帮助并感谢它。我为你的答案投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多