将结帐表单中的字段输入calculate_shipping

时间:2019-03-30 18:22:44

标签: php woocommerce hook-woocommerce

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

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

我有一个使用WC_Shipping_Method方法this tutorial扩展calculate_shipping的类。

在这种方法中,我想使用额外的表格数据(加上目的地)来计算该客户的运费。现在,我只需要添加一个虚拟速率即可显示出来。

我还创建了一个自定义cart-shipping.php文件,以不显示订单查看购物车中可用方法的任何输入,仅显示标签和成本。由于选择是在我的自定义表单中进行的,因此这里没有选项。

  1. 我做对了吗,还是这种方法很hacky?
  2. 如果这是正确的方法,如何在calculate_shipping方法内访问多余的表单字段?

已尝试

以我的自定义格式shipping_method_*命名了最终选项,该选项将触发wc-ajax=update_order_review调用...该调用将初始化我的自定义传送方法类,但似乎从未调用过calculate_shipping方法无论如何。似乎只有在我实际上向订单添加产品时才调用此方法。

也尝试过

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

3 个答案:

答案 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)值:

  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 );
}

答案 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' )
          )
     );
}