我正在为Woocommerce构建一个自定义的送货方式,我完全不知道的是如何将自定义值传递给calculate_shipping()函数,无论是在Cart页面还是Checkout页面上使用它
我需要传递一些影响报价的用户定义变量 - 即“住宅地址”,“是贸易展”等等。
calculate_shipping接收包含“目标”数组的$ package数组,但这只包括标准的add1,add2,city,state,zip,country info。我已经在结算和发货的结帐页面中添加了自定义字段,但我仍然无法弄清楚如何使calculate_shipping函数可以访问这些值。
我添加了一个自定义字段,如下所示:
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Our hooked in function - $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
$fields['shipping']['is_residential'] = array(
'label' => __('Residential Address?', 'woocommerce'),
'type' => 'checkbox',
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
);
return $fields;
}
我看到此字段显示在结帐表单的“运输”部分。但是,我没有看到我可以在任何地方访问它。即使在我知道表单已更新并重新发布后,即使在结帐页面上执行print_r($_POST)
也不会将此字段显示为发布数据的一部分。
但最重要的是,我需要将提交字段的内容添加到$ package对象中,Woocommerce将其传递给送货方法的calculate_shipping()函数。
我真的不确定从哪里开始。
答案 0 :(得分:3)
您不能指望添加结帐字段并在购物车页面上提供这些字段。
正确的方法是使用购物车套餐。
从class-wc-cart.php检查function get_shipping_packages()
public function get_shipping_packages() {
// Packages array for storing 'carts'
$packages = array();
$packages[0]['contents'] = $this->get_cart(); // Items in the package
$packages[0]['contents_cost'] = 0; // Cost of items in the package, set below
$packages[0]['applied_coupons'] = $this->applied_coupons;
$packages[0]['destination']['country'] = WC()->customer->get_shipping_country();
$packages[0]['destination']['state'] = WC()->customer->get_shipping_state();
$packages[0]['destination']['postcode'] = WC()->customer->get_shipping_postcode();
$packages[0]['destination']['city'] = WC()->customer->get_shipping_city();
$packages[0]['destination']['address'] = WC()->customer->get_shipping_address();
$packages[0]['destination']['address_2'] = WC()->customer->get_shipping_address_2();
foreach ( $this->get_cart() as $item )
if ( $item['data']->needs_shipping() )
if ( isset( $item['line_total'] ) )
$packages[0]['contents_cost'] += $item['line_total'];
return apply_filters( 'woocommerce_cart_shipping_packages', $packages );
}
你必须挂钩woocommerce_cart_shipping_packages
过滤器并在那里添加你的字段。
您很可能需要在运费计算器和结帐页面添加它们(您的字段)。
希望这有帮助。