在 WooCommerce 结账中自定义 AJAX 更新外部订单审核 table
Custom AJAX update outside order review table in WooCommerce checkout
在我的 WooCommerce 结帐页面上,我在基于购物车总数的订单审查部分之前显示了一条通知。我在我的子主题的 functions.php
文件中包含了以下代码:
function action_woocommerce_checkout_before_order_review () {
// Get cart total
$cart_total = WC()->cart->get_cart_contents_total();
// Compare
if ( $cart_total == 0.01 ) {
echo '<p>' . __( 'My message', 'woocommerce' ) . '</p>';
}
}
add_action( 'woocommerce_checkout_before_order_review', 'action_woocommerce_checkout_before_order_review', 10, 0 );
此代码的问题在于,如果对订单应用了优惠券(购物车总金额等于 0.01 欧元),则通知不会出现,而是仅在刷新页面后出现。
如何更改此代码,使通知从 added/removed 到 AJAX?
如果您需要根据购物车总数添加自定义消息,您只需使用 Javascript(或 JQuery ).
使用挂钩 woocommerce_checkout_before_order_review
只有当页面加载时购物车的总数等于 0.01
。
时才会显示消息
在这里您可以找到 WooCommerce Javascript 事件的列表:
然后您可以将类似的内容添加到活动主题的 functions.php 文件中 (这只是一个想法):
// show or hide a custom message in checkout based on cart total
add_action( 'wp_footer', 'show_hide_message_based_on_cart_total' );
function show_hide_message_based_on_cart_total() {
?>
<script type="text/javascript">
// the script is triggered every time the checkout updates
jQuery(document.body).on('updated_checkout', function(){
// gets the values of the cart total and the discount total by removing the currency symbol and converting the string to a number
var cartTotal = jQuery('table.shop_table tr.cart-subtotal bdi').text().replace("€","").replace(",",".").trim();
var coupon = jQuery('table.shop_table tr.cart-discount span.amount').text().replace("€","").replace(",",".").trim();
if ( cartTotal - coupon == 0.01 ) {
// show the message
jQuery('<span id="custom_message">Custom Message</span>').insertBefore('#order_review');
} else {
// removes the message
jQuery('#custom_message').remove();
}
});
</script>
<?php
}
以下内容将根据 Ajax 的结账优惠券事件和购物车内容总金额显示或隐藏您的自定义消息:
add_action( 'woocommerce_checkout_before_order_review', 'action_woocommerce_checkout_before_order_review', 10, 0 );
function action_woocommerce_checkout_before_order_review () {
// Here below set your message
$message = __( 'My message', 'woocommerce' );
$threshold = 0.01; // Here your targeted subtotal amount
$cart_total = WC()->cart->get_cart_contents_total();
echo '<p class="custom-message" style="'. ( $cart_total > $threshold ? '' : 'display:none;' ) .'">' . $message . '</p>';
// jQuery Ajax
wc_enqueue_js( "jQuery( function($){
if (typeof wc_checkout_params === 'undefined') return false;
function checkoutCouponEvent() {
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'checkout_coupon',
'ccevent': 'Yes'
},
success: function (response) {
if ( parseFloat(response) == " . $threshold . " ) {
$('.custom-message').show();
} else {
$('.custom-message').hide();
}
}
});
}
$(document.body).on('applied_coupon_in_checkout removed_coupon_in_checkout', function( event ){
setTimeout(function(){
checkoutCouponEvent();
}, event.type === 'removed_coupon_in_checkout' ? 350 : 0 );
});
});" );
}
// Ajax receiver function
add_action( 'wp_ajax_checkout_coupon', 'checkout_coupon_ajax_receiver' );
add_action( 'wp_ajax_nopriv_checkout_coupon', 'checkout_coupon_ajax_receiver' );
function checkout_coupon_ajax_receiver() {
if ( isset($_POST['ccevent']) && $_POST['ccevent'] ) {
echo WC()->cart->get_cart_contents_total();
}
wp_die();
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
以下代码解决了我的问题
function action_woocommerce_checkout_before_order_review () {
$cart_total = WC()->cart->get_cart_contents_total();
if ( $cart_total == 0.01 ) {
echo '<p class="notice">' . __( 'My message', 'woocommerce' ) . '</p>';
}
?>
<script type="text/javascript">
jQuery('.woocommerce-remove-coupon').click(function(){
jQuery('.notice').hide();
});
</script>
<?php
}
add_action( 'woocommerce_review_order_before_cart_contents', 'action_woocommerce_checkout_before_order_review', 10, 0 );
在我的 WooCommerce 结帐页面上,我在基于购物车总数的订单审查部分之前显示了一条通知。我在我的子主题的 functions.php
文件中包含了以下代码:
function action_woocommerce_checkout_before_order_review () {
// Get cart total
$cart_total = WC()->cart->get_cart_contents_total();
// Compare
if ( $cart_total == 0.01 ) {
echo '<p>' . __( 'My message', 'woocommerce' ) . '</p>';
}
}
add_action( 'woocommerce_checkout_before_order_review', 'action_woocommerce_checkout_before_order_review', 10, 0 );
此代码的问题在于,如果对订单应用了优惠券(购物车总金额等于 0.01 欧元),则通知不会出现,而是仅在刷新页面后出现。
如何更改此代码,使通知从 added/removed 到 AJAX?
如果您需要根据购物车总数添加自定义消息,您只需使用 Javascript(或 JQuery ).
使用挂钩 woocommerce_checkout_before_order_review
只有当页面加载时购物车的总数等于 0.01
。
在这里您可以找到 WooCommerce Javascript 事件的列表:
然后您可以将类似的内容添加到活动主题的 functions.php 文件中 (这只是一个想法):
// show or hide a custom message in checkout based on cart total
add_action( 'wp_footer', 'show_hide_message_based_on_cart_total' );
function show_hide_message_based_on_cart_total() {
?>
<script type="text/javascript">
// the script is triggered every time the checkout updates
jQuery(document.body).on('updated_checkout', function(){
// gets the values of the cart total and the discount total by removing the currency symbol and converting the string to a number
var cartTotal = jQuery('table.shop_table tr.cart-subtotal bdi').text().replace("€","").replace(",",".").trim();
var coupon = jQuery('table.shop_table tr.cart-discount span.amount').text().replace("€","").replace(",",".").trim();
if ( cartTotal - coupon == 0.01 ) {
// show the message
jQuery('<span id="custom_message">Custom Message</span>').insertBefore('#order_review');
} else {
// removes the message
jQuery('#custom_message').remove();
}
});
</script>
<?php
}
以下内容将根据 Ajax 的结账优惠券事件和购物车内容总金额显示或隐藏您的自定义消息:
add_action( 'woocommerce_checkout_before_order_review', 'action_woocommerce_checkout_before_order_review', 10, 0 );
function action_woocommerce_checkout_before_order_review () {
// Here below set your message
$message = __( 'My message', 'woocommerce' );
$threshold = 0.01; // Here your targeted subtotal amount
$cart_total = WC()->cart->get_cart_contents_total();
echo '<p class="custom-message" style="'. ( $cart_total > $threshold ? '' : 'display:none;' ) .'">' . $message . '</p>';
// jQuery Ajax
wc_enqueue_js( "jQuery( function($){
if (typeof wc_checkout_params === 'undefined') return false;
function checkoutCouponEvent() {
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'checkout_coupon',
'ccevent': 'Yes'
},
success: function (response) {
if ( parseFloat(response) == " . $threshold . " ) {
$('.custom-message').show();
} else {
$('.custom-message').hide();
}
}
});
}
$(document.body).on('applied_coupon_in_checkout removed_coupon_in_checkout', function( event ){
setTimeout(function(){
checkoutCouponEvent();
}, event.type === 'removed_coupon_in_checkout' ? 350 : 0 );
});
});" );
}
// Ajax receiver function
add_action( 'wp_ajax_checkout_coupon', 'checkout_coupon_ajax_receiver' );
add_action( 'wp_ajax_nopriv_checkout_coupon', 'checkout_coupon_ajax_receiver' );
function checkout_coupon_ajax_receiver() {
if ( isset($_POST['ccevent']) && $_POST['ccevent'] ) {
echo WC()->cart->get_cart_contents_total();
}
wp_die();
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
以下代码解决了我的问题
function action_woocommerce_checkout_before_order_review () {
$cart_total = WC()->cart->get_cart_contents_total();
if ( $cart_total == 0.01 ) {
echo '<p class="notice">' . __( 'My message', 'woocommerce' ) . '</p>';
}
?>
<script type="text/javascript">
jQuery('.woocommerce-remove-coupon').click(function(){
jQuery('.notice').hide();
});
</script>
<?php
}
add_action( 'woocommerce_review_order_before_cart_contents', 'action_woocommerce_checkout_before_order_review', 10, 0 );