Ran*_*all 8 php woocommerce hook-woocommerce
我正在为WooCommerce商店创建自定义运输计算器。我需要从用户那里收集一些额外的表格数据,以正确计算运费。
我将表单字段添加到中woocommerce_checkout_after_customer_details。一旦弄清了结帐页面的功能,就可以很容易地将其放入购物车页面,因此让我们集中精力。
在本教程中,我有一个扩展WC_Shipping_Method了calculate_shipping方法的类。
在这种方法中,我想使用额外的表格数据(加上目的地)来为该客户计算运费。现在,我只需要添加一个虚拟速率即可显示出来。
我还创建了一个自定义cart-shipping.php文件,以不显示订单查看购物车中可用方法的任何输入,仅显示标签和成本。由于选择是在我的自定义表单中进行的,因此这里没有选项。
calculate_shipping?试过
在我的自定义表单中命名了最终选项,该选项shipping_method_*触发了wc-ajax=update_order_review调用...,它初始化了我的自定义运输方法类,但似乎从未以任何方式调用该calculate_shipping方法。似乎只有在我实际上向订单添加产品时才调用此方法。
也尝试过
定义了我所有可能的交付选项,并将它们添加到calculate_shipping中,如$this->add_rate( $rate );。我认为当通过update_order_reviewajax调用更新购物车时,我可以以某种方式选择一个(将用户强制为一个)?同样,设置选项应由用户在结帐表单上与之交互的这些字段确定。但是我还没有弄清楚如何设置该动作的发送方式。
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"...>
Run Code Online (Sandbox Code Playgroud)
然后你可以使用superglobal 或以下方法获取提交的 ( POSTed) 值:$_POSTWC_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 );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |