下面的代码适用于简单产品的WooCommerce添加到购物车,但不适用于可变产品。有人能帮帮我吗?因为这个代码与最新的WC工作,请不要删除这个问题,因为有很多代码,这在网上根本不工作。
我得到的错误是在一个通知中说,我应该选择一个产品选项,即使我选择了一个。
JS:
jQuery(function($) {
$('form.cart').on('submit', function(e) {
e.preventDefault();
var form = $(this);
form.block({ message: null, overlayCSS: { background: '#fff', opacity: 0.6 } });
var formData = new FormData(form.context);
formData.append('add-to-cart', form.find('[name=add-to-cart]').val() );
var $thisbutton = form.find('.single_add_to_cart_button'); //
// Ajax action
$.ajax({
url: wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'ace_add_to_cart' ),
data: formData,
type: 'POST',
processData: false,
contentType: false,
beforeSend: function (response) {
$thisbutton.removeClass('added').addClass('loading');
},
complete: function( response ) {
response = response.responseJSON;
if ( ! response ) {
return;
}
if ( response.error && response.product_url ) {
window.location = response.product_url;
return;
}
// Redirect to cart option
if ( wc_add_to_cart_params.cart_redirect_after_add === 'yes' ) {
window.location = wc_add_to_cart_params.cart_url;
return;
}
// Trigger event so themes can refresh other areas.
$( document.body ).trigger( 'added_to_cart', [ response.fragments, response.cart_hash, $thisbutton ] );
// Remove existing notices
$( '.woocommerce-error, .woocommerce-message, .woocommerce-info' ).remove();
// Add new notices
form.closest('.product').before(response.fragments.notices_html)
form.unblock();
}
});
});
});
PHP:
/* WOOCOMMERCE AJAX ADD TO CART
--------------------------------------------------- */
function ace_ajax_add_to_cart_handler() {
WC_Form_Handler::add_to_cart_action();
WC_AJAX::get_refreshed_fragments();
}
/* Add fragments for notices. */
function ace_ajax_add_to_cart_add_fragments( $fragments ) {
$all_notices = WC()->session->get( 'wc_notices', array() );
$notice_types = apply_filters( 'woocommerce_notice_types', array( 'error', 'success', 'notice' ) );
ob_start();
foreach ( $notice_types as $notice_type ) {
if ( wc_notice_count( $notice_type ) > 0 ) {
wc_get_template( "notices/{$notice_type}.php", array(
'messages' => array_filter( $all_notices[ $notice_type ] ),
'notices' => array_filter( $all_notices[ $notice_type ] ),
) );
}
}
$fragments['notices_html'] = ob_get_clean();
wc_clear_notices();
return $fragments;
}
add_action( 'wc_ajax_ace_add_to_cart', 'ace_ajax_add_to_cart_handler' );
add_action( 'wc_ajax_nopriv_ace_add_to_cart', 'ace_ajax_add_to_cart_handler' );
remove_action( 'wp_loaded', array( 'WC_Form_Handler', 'add_to_cart_action' ), 20 ); // Remove WC Core add to cart handler to prevent double-add
add_filter( 'woocommerce_add_to_cart_fragments', 'ace_ajax_add_to_cart_add_fragments' );
2条答案
按热度按时间j91ykkif1#
要在单一产品页面上为简单和可变产品启用Ajax添加到购物车**,您需要做一些不同的事情,构建一个自定义Ajax添加到购物车功能**,还可以处理自定义产品字段和购物车项目数据操作 (WooCommerce默认Ajax添加到购物车不允许)。
尝试以下在WooCommerce 4.9.0版上经过全面测试的程序:
代码放在活动子主题(或活动主题)的functions.php文件中。测试和作品。
所有通知均启用并即时显示:
处理产品自定义字段和购物车项目数据操作:
这个自定义Ajax添加到购物车代码处理产品自定义字段,允许将它们添加为自定义购物车项目数据。
为此,我们使用
woocommerce_add_cart_item_data
WooCommerce专用钩子在我们的自定义Ajax添加到购物车代码中启用,允许添加产品自定义字段作为自定义购物车项目数据或动态操作购物车数据。如果我们使用以下代码添加产品自定义输入文本字段:
然后,如果要将字段值作为自定义购物车项目数据传递,则将使用
你可以检查以下,这将显示在购物车和结帐,自定义购物车项目数据:
代码放在活动子主题(或活动主题)的functions.php文件中。测试和作品。
备注:
$('.content-area').before(response);
与$('.products').before(response);
正确显示通知
pgvzfuti2#
感谢有用的片段,但上面的代码不适用于访客使用,而仅适用于登录。wc_fragment_refresh在您注销并将其用作访客用户时不会触发。
问候