代码之家  ›  专栏  ›  技术社区  ›  Randy Hall

获取额外的信息,以计算运费

  •  0
  • Randy Hall  · 技术社区  · 5 年前

    woocommerce_checkout_after_customer_details . 一旦我弄清楚了checkout页面的功能,我就可以很容易地把它放到cart页面中,所以让我们关注一下这个。

    我有一节课 WC_Shipping_Method 用一个 calculate_shipping 方法a la this tutorial .

    在该方法中,我希望使用额外的表单数据(加上目的地)来计算该客户的发货量。现在我把这个加上一个虚拟利率,它就出现了。

    cart-shipping.php 文件,不显示订单审核购物车中可用方法的任何输入,仅显示标签和成本。因为拣选是在我的自定义表单中进行的,所以这里没有选择的必要。

    1. 我这样做是对的,还是这个方法太老套了?
    2. 如果这是正确的方法,那么如何访问 计算运费

    在自定义窗体中命名最终选项 shipping_method_* wc-ajax=update_order_review 呼叫。。。它初始化了我的自定义shipping方法类,但似乎从未调用 计算运费 无论如何,方法。唯一一次调用这个方法是在我实际向订单添加产品时。

    也试过了

    定义了所有可能的交付选项,并将它们添加到 $this->add_rate( $rate ); . 我想这样我就可以在购物车更新时选择一个(强制用户进入一个) update_order_review

    0 回复  |  直到 5 年前
        1
  •  2
  •   Randy Hall    5 年前

    calculate_shipping() 不总是这样

    首先,你应该知道 只有在第一次(在当前的WooCommerce会话中)计算运费时,每次将产品添加到购物车之后,以及每次更改送货地址时(从购物车或结帐页),才会调用shipping方法类的方法。

    当然,插件或自定义代码可以 以编程方式

    速率基于包散列存储在会话中 避免 每次页面加载时重新计算

    以及 计算运费() WC_Shipping 通过其 calculate_shipping_for_package() 方法。事实上,上述引语取自 WC_Shipping::calculate_shipping_for_package() 哪个电话 WC_Shipping_Method::get_rates_for_package() 最终 方法。

    如何从 计算运费()

    所以如果你在结帐单上有这个:

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

    然后你就可以得到提交的( POST $_POST 超全局或 WC_Checkout::get_value()

    1. $_POST['my_field']

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

    就这么简单。:)


    以确保调用

    运行类似于下面的操作来清除会话信息,这将表明仍然需要进行计算。请注意,如果您在每一页上都这样做,这将意味着在不需要重新计算时,会不断地重新计算发货量。

    $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 );
    }
    
        2
  •  0
  •   Randy Hall    5 年前

    我不确定这是否是实现这一点的最佳方法,但目前我正在通过在上设置会话值来实现这一点 woocommerce_checkout_update_order_review calculate_shipping 方法。

        3
  •  -3
  •   DataDeer.net    5 年前

    查看WooCommerce文档,您似乎希望通过它们从 calculate_shipping 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' )
              )
         );
    }