woocommerce_before_calculate_totals发射两次

时间:2017-10-18 20:29:36

标签: php wordpress woocommerce

在网站上写一个附加内容,想要修改购物车中的价格。请准备以下代码:

import scala.util.parsing.combinator.RegexParsers

case class S(e: E)

// E2 -> E | NIL
sealed abstract class E2
case class E(c: C, e2: E2) extends E2
case object NIL extends E2 { override def toString = "NIL()" }

case class C(aOrB: String)

class MPParser extends RegexParsers {
  // S -> E
  def s: Parser[S] = e ^^ { S(_) }
  // E -> C E2
  def e: Parser[E] = c ~ e2 ^^ { case c ~ e2 => E(c, e2) }
  // E2 -> E | NIL
  def e2: Parser[E2] = opt(e) ^^ { _.getOrElse(NIL) }
  // C -> 'a' | 'b'
  def c: Parser[C] = ("a" | "b") ^^ { C(_) }
}

object Microproject extends App {
  val parser = new MPParser
  for (arg <- args) {
    println("input : " + arg)
    println(parser.parseAll(parser.s, arg))
  }
}

由于某种原因,钩子woocommerce_before_calculate_totals发射两次。如果我只用echo 1替换函数apd_apply_custom_price_to_cart_item($ cart_object)中的代码;它在购物车页面中显示11。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

很可能其他一些插件会挂钩'woocommerce_before_calculate_totals'动作。

尝试逐个禁用插件,看看是否会导致此行为。

在我的案例中,我发现woocommerce-multilingual插件与woocommerce_before_calculate_totals行动挂钩。

所以我这样做了:

add_action( 'woocommerce_before_calculate_totals', '_wm_ponc_upte_prc', 99 );
function _wm_ponc_upte_prc( $cart_object ) {
    if ( !WC()->session->__isset( "reload_checkout" ) ) {
        foreach ( WC()->cart->get_cart() as $key => $value ) {
            // checking if user checked checkbox (optional)
            if ( isset( $value['wm_ponc_fee'] ) && ( $value[ 'wm_ponc_fee' ] === 'yes' ) ) {
                // your calculations ....
                // and Remove your action after you are done.
                remove_action( 'woocommerce_before_calculate_totals', '_wm_ponc_upte_prc', 99 );
            }
        }
    }
}

我在自定义计算后删除了操作。就是这样。

希望它有所帮助。

抱歉我的英语。

答案 1 :(得分:1)

我看到了完全相同的问题 - 我的钩子功能被触发两次,导致选项价格增加2倍的成本。我的解决方案是加载产品,从中获取价格,然后将增量成本添加到该产品中。

function tbk_woo_update_option_price($ cart_object){

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="target">
  <div class="gridster">
    <table border="1" class=".table-responsive">
      <tr>
        <th colspan="4" style="background-color:#05345c;">Zone 1</th>
        <th colspan="4" style="background-color:#05345c;">Zone 2</th>
        <th colspan="4" style="background-color:#05345c;">Zone 3</th>
      </tr>
      <tr>
        <td width="400" align="center" style="background-color:#0085ca">Sub 1</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 2</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 3</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 4</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 1</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 2</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 3</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 4</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 1</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 2</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 3</td>
        <td width="400" align="center" style="background-color:#0085ca">Sub 4</td>
      </tr>
    </table>
    <div id="outer-dropzone" class="dropzone">
      <ul></ul>
    </div>
  </div>
</div>

<button class="add-button btn btn-success mr-2">Add widget</button>


<div id="yes-drop" class="draggable drag-drop"><img src="https://d30y9cdsu7xlg0.cloudfront.net/png/72-200.png" height="30" width="30" class="brand"><button onclick="removediv(event)">-</button></div>

<div id="yes-drop" class="draggable drag-drop"><img src="https://d30y9cdsu7xlg0.cloudfront.net/png/72-200.png" height="30" width="30" class="brand"><button onclick="removediv(event)">-</button></div>

<div id="yes-drop" class="draggable drag-drop"><img src="https://d30y9cdsu7xlg0.cloudfront.net/png/72-200.png" height="30" width="30" class="brand"><button onclick="removediv(event)">-</button></div>

} add_action(&#39; woocommerce_before_calculate_totals&#39;,&#39; tbk_woo_update_option_price&#39;,1000,1);

答案 2 :(得分:1)

我忘记了我应该参考的解决方案链接。您可以在函数顶部使用它:

if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
    return;