首页 > 解决方案 > 从结帐表单中获取字段到 calculate_shipping

问题描述

我正在为我的 WooCommerce 商店创建一个自定义运费计算器。我需要从用户那里收集一些额外的表单数据来正确计算运费。

我已将表单字段添加到woocommerce_checkout_after_customer_details. 一旦我弄清楚结帐页面的功能,我可能可以毫不费力地将它放入购物车页面,所以让我们专注于此。

我有一个使用本教程WC_Shipping_Method中的calculate_shipping方法扩展的类。

在这种方法中,我想使用额外的表单数据(加上目的地)来计算该客户的运费。现在我只是添加了一个虚拟汇率,它会显示出来。

我还创建了一个自定义cart-shipping.php文件,不显示订单审查购物车中可用方法的任何输入,只显示标签和成本。由于采摘是在我的自定义表单中进行的,因此无需在此处设置选项。

  1. 我这样做对吗,还是这种方法超级hacky?
  2. 如果这是正确的方法,我如何访问calculate_shipping方法内的额外表单字段?

试过

在我的自定义表单shipping_method_*中命名了触发调用的最终选项......它初始化了我的自定义运输方法类,但无论如何wc-ajax=update_order_review似乎都没有调用该方法。calculate_shipping似乎唯一一次调用此方法是当我实际将产品添加到订单中时。

也试过

定义了我所有可能的交付选项,并将它们添加到 calculate_shipping 中$this->add_rate( $rate );。我想当购物车通过update_order_reviewajax 调用更新时,我可以以某种方式选择一个(强制用户进入一个)?同样,设置选项应由用户在结帐表单上与之交互的这些字段确定。但是我还没有弄清楚如何设置该操作的运输。

标签: phpwoocommercehook-woocommerce

解决方案


calculate_shipping()并不总是被称为

首先,您应该知道,calculate_shipping()您的运输方法类的方法只会在第一次计算运费时(在当前的 WooCommerce 会话中)、每次将产品添加到购物车后以及每当送货地址已更改 - 从购物车或结帐页面。

但当然,插件或自定义代码可以随时以编程方式调用该方法(或重新计算费率)。但是,默认行为如下:

费率根据包哈希存储在会话中,以避免每次页面加载时重新计算

并且方法是由类通过它的calculate_shipping()方法来执行的。事实上,上面的引用取自对哪些调用以及最终是您自己的类中的方法的描述。WC_Shippingcalculate_shipping_for_package()WC_Shipping::calculate_shipping_for_package()WC_Shipping_Method::get_rates_for_package()calculate_shipping()

如何从calculate_shipping()方法中获取结帐表单中表单字段的提交值

因此,如果您在结帐表格中有此内容:

<input type="text" name="my_field"...>

POST然后您可以使用$_POST超全局或方法获取提交的( ed )值WC_Checkout::get_value()

  1. $_POST['my_field']

  2. WC()->checkout->get_value( 'my_field' )

就这么简单。:)


确保调用calculate_shipping

运行类似下面的命令清除会话信息,这表明仍然需要进行计算。请注意,如果您在每一页上都这样做,则意味着运费会在不需要时不断地重新计算。

$packages = WC()->cart->get_shipping_packages();
foreach( $packages as $package_key => $package ) {
    $session_key  = 'shipping_for_package_'.$package_key;
    $stored_rates = WC()->session->__unset( $session_key );
}

推荐阅读