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

byqmnocz  于 2023-01-16  发布在  PHP
关注(0)|答案(2)|浏览(115)

我想得到所有的数据(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);

但是它总是返回没有世界其他地区的结果。我如何才能获得所有免费送货区的所有数据?

mklgxw1f

mklgxw1f1#

我在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运输区域对象([数据:受保护]=〉数组([区域ID]=〉0

  • [区域名称]=〉世界其他地区*[区域顺序]=〉0 [区域位置]=〉Array())[位置已更改:WC运输区域:专用]=〉[缓存组:受保护]=〉[元类型:受保护]=〉post [元的对象ID字段:受保护]=〉[元数据:受保护]=〉Array()[内部元密钥:受保护]=〉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_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 …
ilmyapht

ilmyapht2#

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

    }

相关问题