php - 从结帐表单中获取字段到 calculate_shipping
问题描述
我正在为我的 WooCommerce 商店创建一个自定义运费计算器。我需要从用户那里收集一些额外的表单数据来正确计算运费。
我已将表单字段添加到woocommerce_checkout_after_customer_details
. 一旦我弄清楚结帐页面的功能,我可能可以毫不费力地将它放入购物车页面,所以让我们专注于此。
我有一个使用本教程WC_Shipping_Method
中的calculate_shipping
方法扩展的类。
在这种方法中,我想使用额外的表单数据(加上目的地)来计算该客户的运费。现在我只是添加了一个虚拟汇率,它会显示出来。
我还创建了一个自定义cart-shipping.php
文件,不显示订单审查购物车中可用方法的任何输入,只显示标签和成本。由于采摘是在我的自定义表单中进行的,因此无需在此处设置选项。
- 我这样做对吗,还是这种方法超级hacky?
- 如果这是正确的方法,我如何访问
calculate_shipping
方法内的额外表单字段?
试过
在我的自定义表单shipping_method_*
中命名了触发调用的最终选项......它初始化了我的自定义运输方法类,但无论如何wc-ajax=update_order_review
似乎都没有调用该方法。calculate_shipping
似乎唯一一次调用此方法是当我实际将产品添加到订单中时。
也试过
定义了我所有可能的交付选项,并将它们添加到 calculate_shipping 中$this->add_rate( $rate );
。我想当购物车通过update_order_review
ajax 调用更新时,我可以以某种方式选择一个(强制用户进入一个)?同样,设置选项应由用户在结帐表单上与之交互的这些字段确定。但是我还没有弄清楚如何设置该操作的运输。
解决方案
calculate_shipping()
并不总是被称为
首先,您应该知道,calculate_shipping()
您的运输方法类的方法只会在第一次计算运费时(在当前的 WooCommerce 会话中)、每次将产品添加到购物车后以及每当送货地址已更改 - 从购物车或结帐页面。
但当然,插件或自定义代码可以随时以编程方式调用该方法(或重新计算费率)。但是,默认行为如下:
费率根据包哈希存储在会话中,以避免每次页面加载时重新计算。
并且方法是由类通过它的calculate_shipping()
方法来执行的。事实上,上面的引用取自对哪些调用以及最终是您自己的类中的方法的描述。WC_Shipping
calculate_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()
:
$_POST['my_field']
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 );
}
推荐阅读
- javascript - 新手项目 - 从 BroadcastReceive 开始一个活动
- c - 获得左移负数的警告
- ruby-on-rails - 检查 rspec FactoryBot 中的用户角色
- mysql - 无法添加主键约束
- python - 网页抓取 - 进入第 2 页
- javascript - 在一个承诺中,我想将值(值本身来自另一个承诺)分配给一个将在该承诺之外使用的变量
- javascript - 如何制作垂直进度指示图
- python - 将函数作为参数传递给另一个函数时如何指定输入函数参数类型和返回类型?
- python - dtype 'object' 的 4D np.array 与 dtype 'uint8' 的 3D np.array 作为元素
- json - 使用 Gspread 逐行更新 Google 电子表格