在网站上写一个附加内容,想要修改购物车中的价格。请准备以下代码:
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。有人可以帮忙吗?
答案 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;