在 WooCommerce 中,我想在按下“添加到购物车”按钮后将相应产品添加到购物车时更新“添加到购物车”文本。
反之亦然,这样,当按下“从购物车中删除按钮”将相应产品从购物车中删除时,“添加到购物车”文本就会更改。
以下代码需要刷新页面以反映产品的状态并更新“添加到购物车”按钮文本。
add_filter( 'woocommerce_product_single_add_to_cart_text', 'already_in_cart_single_add_to_cart_text', 10, 2 );
function already_in_cart_single_add_to_cart_text( $add_to_cart_text, $product ) {
foreach( WC()->cart->get_cart() as $item ) {
if( $item['data']->get_id() === $product->get_id() ) {
return __('Product already in Cart. Add again?', 'woocommerce');
}
}
return $add_to_cart_text;
}
但是,我希望在按下“添加到购物车”按钮或“从购物车中删除”按钮时更新。
请注意,您当前的代码仅适用于简单的产品。所以我的答案代码也适用于简单的产品。
要动态更新产品添加到购物车文本,如果产品在购物车中并被删除,则需要 JavaScript 和 Ajax。
尝试以下操作:
// Filter product button single add to cart text
add_filter( 'woocommerce_product_single_add_to_cart_text', 'already_in_cart_single_add_to_cart_text', 10, 2 );
function already_in_cart_single_add_to_cart_text( $add_to_cart_text, $product ) {
if (!$product->is_type('simple')) {
return $add_to_cart_text;
}
foreach( WC()->cart->get_cart() as $item ) {
if( $item['data']->get_id() === $product->get_id() ) {
return __('Product already in Cart. Add again?', 'woocommerce');
}
}
return $add_to_cart_text;
}
// Check dynamically cart items via Ajax and update add to cart text (jQuery)
add_action( 'woocommerce_before_add_to_cart_button', 'ajax_update_single_add_to_cart_text' );
function ajax_update_single_add_to_cart_text(){
global $product;
if (!$product->is_type('simple')) return;
wc_enqueue_js("$(document.body).on( 'added_to_cart removed_from_cart', function(){
$.ajax({
type: 'POST',
url: '" . admin_url('/admin-ajax.php') . "',
data: {
'action': 'check_cart_items',
'product_id': ".$product->get_id()."
},
success: function (response) {
$('[name=add-to-cart]').html(response)
}
});
});");
}
// PHP AJAX Receiver: Process the ajax request (check cart items)
add_action('wp_ajax_check_cart_items', 'check_cart_items_for_single_add_to_cart_text');
add_action('wp_ajax_nopriv_check_cart_items', 'check_cart_items_for_single_add_to_cart_text');
function check_cart_items_for_single_add_to_cart_text() {
if ( isset($_POST['product_id']) && $_POST['product_id'] > 0 ) {
// Loop through cart items
foreach( WC()->cart->get_cart() as $item ) {
if( $item['data']->get_id() == intval($_POST['product_id']) ) {
wp_die( __('Product already in Cart. Add again?', 'woocommerce') );
}
}
wp_die( __('Add to cart', 'woocommerce') );
}
wp_die();
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。