我正在为WooCommerce商店创建自定义运输计算器。我需要从用户那里收集一些额外的表格数据,以正确计算运费。
我已将表单字段添加到woocommerce_checkout_after_customer_details
。一旦弄清了结帐页面的功能,我可能可以很容易地将它放入购物车页面,所以让我们专注于此。
我有一个使用WC_Shipping_Method
方法this tutorial扩展calculate_shipping
的类。
在这种方法中,我想使用额外的表格数据(加上目的地)来计算该客户的运费。现在,我只需要添加一个虚拟速率即可显示出来。
我还创建了一个自定义cart-shipping.php
文件,以不显示订单查看购物车中可用方法的任何输入,仅显示标签和成本。由于选择是在我的自定义表单中进行的,因此这里没有选项。
calculate_shipping
方法内访问多余的表单字段?已尝试
以我的自定义格式shipping_method_*
命名了最终选项,该选项将触发wc-ajax=update_order_review
调用...该调用将初始化我的自定义传送方法类,但似乎从未调用过calculate_shipping
方法无论如何。似乎只有在我实际上向订单添加产品时才调用此方法。
也尝试过
定义了我所有可能的投放选项,并像$this->add_rate( $rate );
一样将它们添加到calculate_shipping中。我认为当通过update_order_review
ajax调用更新购物车时,我可以以某种方式选择一个(将用户强制为一个)吗?同样,设置选项应由用户在结帐表单上与之交互的这些字段确定。但是我还没有弄清楚如何设置该动作的发送方式。
答案 0 :(得分:1)
calculate_shipping()
并非总是被称为 首先,您应该知道,仅在每次商品交付后第一次(在当前的WooCommerce会话中)计算运费时,才会调用运输方法类的calculate_shipping()
方法。添加到购物车中,以及每当更改送货地址时-从购物车或结帐页面。
但是,当然,插件或自定义代码可以以编程方式随时调用该方法(或重新计算费率)。但是,默认行为如下:
根据包哈希值将费率存储在会话中,以避免 重新计算每次页面加载。
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
方法获取提交的(WC_Checkout::get_value()
ed)值:
$_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 );
}
答案 1 :(得分:0)
我不确定这是否是实现此目标的最佳方法,但是目前我正在通过在woocommerce_checkout_update_order_review
上设置会话值,然后在calculate_shipping
方法中访问该值来完成此工作。
答案 2 :(得分:-1)
查看WooCommerce文档,似乎您希望通过calculate_shipping
函数访问诸如用户位置之类的东西的方法是使用其Settings API。 https://docs.woocommerce.com/document/settings-api/。阅读文档以确切了解操作方法,但这是一个简化:
$this->init_settings();
$this->location = $this->settings['location'];
<?php function admin_options() {
?>
<h2><?php _e('You plugin name','woocommerce'); ?></h2>
<table class="form-table">
<?php $this->generate_settings_html(); ?>
</table><?php
}
表将由
制成function init_form_fields() {
$this->form_fields = array(
'location' => array(
'title' => __( 'Location', 'woocommerce' ),
'type' => 'text',
'description' => __( 'This is the users address.', 'woocommerce' ),
'default' => __( 'none', 'woocommerce' )
)
);
}