Woocommerce自定义字段的运费计算器

时间:2014-02-14 22:31:55

标签: wordpress woocommerce

我正在为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()函数。

我真的不确定从哪里开始。

1 个答案:

答案 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过滤器并在那里添加你的字段。

您很可能需要在运费计算器和结帐页面添加它们(您的字段)。

希望这有帮助。