在运行时更新woocommerce运输价值

时间:2014-04-15 09:51:47

标签: php jquery ajax wordpress woocommerce

我对php和woocommerce相当新。我正在使用wordpress和woocommerce的电子商务网站。公司使用和API根据购物车中商品的面积和尺寸以及商品数量计算运费。我已设法将所有需要的值解析为API,我确实收到了回复。我为所提供的3个测试率创建了一个自定义的运输插件。 在我的脚本中,我创建会话,其中包含每个运送方法的总数,如下所示:

    $_SESSION['overnight']= $quoteResponse->results[0]->rates[2]->total;

然后在我的自定义送货插件中,我启动会话并将成本设置为会话内的值:

    <?php
    session_start();

    * Check if WooCommerce is active
    */
    if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins',     get_option( 'active_plugins' ) ) ) ) {

    function WC_Overnight_Express_init() {
    if ( ! class_exists( 'WC_Overnight_Express' ) ) {
    class WC_Overnight_Express extends WC_Shipping_Method {
    /**
    * Constructor for your shipping class
    *
    * @access public
    * @return void
    */
   public function __construct() {
   $this->id = 'overnight express'; // Id for your shipping method. Should be uunique.
   $this->method_title = __( 'Overnight Express' ); // Title shown in admin
   $this->method_description = __( 'Overnight Express Shipping method' ); 

   $this->enabled = "yes"; // This can be added as an setting but for this example its forced enabled
   $this->title = "Overnight Express"; // This can be added as an setting but for this example its forced.

   $this->init();
   }

   /**
   * Init your settings
   *
   * @access public
   * @return void
   */
   function init() {
   // Load the settings API
   $this->init_form_fields(); // This is part of the settings API. Override the method to add your own settings
   $this->init_settings(); // This is part of the settings API. Loads settings you previously init.


   // Save settings in admin if you have any defined
   add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this,      'process_admin_options' ) );
   }

   /**
   * calculate_shipping function.
   *
   * @access public
   * @param mixed $package
   * @return void
   */
   public function calculate_shipping() {
   $rate = array(
   'id' => $this->id,
   'label' => $this->title,
   'cost' =>$_SESSION['overnight'],
   'calc_tax' => 'per_item'
   );

   // Register the rate
   $this->add_rate( $rate );
   }
   } 
   }
   }

   add_action( 'woocommerce_shipping_init', 'WC_Overnight_Express_init' );

   function add_overnight_method( $methods ) {
   $methods[] = 'WC_Overnight_Express'; 
   return $methods;
   }

   add_filter( 'woocommerce_shipping_methods', 'add_overnight_method' );
   }

   ?>

我的问题是我的API从API返回后他们不更新他们显示的运费总额&#34;免费&#34;如果我打开购物车并返回结帐页面,则只能使用udpate。我想要做的是在从API返回总数时在运行时更新它们。这是我在stackoverlow上的第一篇文章,任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:2)

首先,我认为您应该在WC_Overnight_Express_init函数中实现该类,因为原样,无法运行contruct方法。

然后,在woocommerce系统工具中有一个选项可以调试运输方法,在开发过程中激活它确实是一个好主意(抱歉屏幕截图是法语,但是你明白了,对吧?) :

screenshot

答案 1 :(得分:0)

修改

尝试在if子句之外放置add_action和add_filter代码。我知道这听起来很疯狂但通常会有所帮助。

经过一番思考后,我很确定问题存在于$_SESSION中。请遵循我的建议,并在calculate_shipping方法中进行所有计算。当然,你可以为测试perpouse设置任何静态值。或者制作var_dump($_SESSION) 在calculate_shipping中确保一切都符合预期(在ajax上我经常使用file_put_contents或 flip / whoops )。

送货计算

接下来在calculate_shipping metod中你可以获得购物车内容并制作你的魔法:

function calculate_shipping() {
    $cart = WC_Cart::get_cart() 
    foreach($cart as $item){
        //magic
    }
}

旧答案

正确挂钩

您应该将运输逻辑挂钩到:

add_action( 'woocommerce_shipping_init', 'tutsplus_shipping_method' );

function add_tutsplus_shipping_method( $methods ) {
    $methods[] = 'WC_Overnight_Express';
    return $methods;
}

add_filter( 'woocommerce_shipping_methods', 'add_tutsplus_shipping_method' );

送货计算

接下来在calculate_shipping metod中你可以获得购物车内容并制作你的魔法:

function calculate_shipping(){
    $cart = WC_Cart::get_cart() 
    foreach($cart as $item){
        //magic
    }
}

对于实时更新购物车评论,这可能会有所帮助:

https://stackoverflow.com/a/47133456/8888443

更多帮助

看看这个tuturial: https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce--cms-26098

如果您是wordpress开发的新手,我强烈建议您熟悉动作/钩子。 woocommerce和wordpress都有很好的参考。

https://codex.wordpress.org/Plugin_API/Action_Reference

https://docs.woocommerce.com/wc-apidocs/hook-docs.html