ajax - 使用 ajax 添加到购物车时如何添加 Woocommerce 通知(无需重新加载)?

标签 ajax woocommerce notifications cart

我尝试使添加到购物车按钮和产品页面(以及其他任何地方)上的通知与 ajax 一起使用。但是通知(例如,您不能将该金额添加到购物车 - 我们有 X 存货,而您的购物车中已经有 Y。)不起作用。

我如何使它工作?

这就是我现在所拥有的:

JS for AJAX 添加到购物车处理

/**
 * JS for AJAX Add to Cart handling
 */
function ace_product_page_ajax_add_to_cart_js() {
    ?><script type="text/javascript" charset="UTF-8">
        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() );

                // 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,
                    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;
                        }

                        var $thisbutton = form.find('.single_add_to_cart_button'); //
                        var $thisbutton = null; // don't want the 'View cart' button

                        // 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();
                    }
                });
            });
        });
    </script><?php
}
add_action( 'wp_footer', 'ace_product_page_ajax_add_to_cart_js' );

添加到购物车处理程序:
/**
 * Add to cart handler
 */
function ace_ajax_add_to_cart_handler() {
    WC_Form_Handler::add_to_cart_action();
    WC_AJAX::get_refreshed_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 WC Core add to cart handler to prevent double-add
remove_action( 'wp_loaded', array( 'WC_Form_Handler', 'add_to_cart_action' ), 20 );

为通知添加片段:
/**
 * 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 ] ),
            ) );
        }
    }
    $fragments['notices_html'] = ob_get_clean();

    wc_clear_notices();

    return $fragments;
}
add_filter( 'woocommerce_add_to_cart_fragments', 'ace_ajax_add_to_cart_add_fragments' );

最佳答案

尝试替换最后一个片段 'messages' => array_filter( ...'notices' => array_filter( ...它应该工作。

关于ajax - 使用 ajax 添加到购物车时如何添加 Woocommerce 通知(无需重新加载)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60487478/

相关文章:

javascript - AJAX响应文本没有得到任何东西

php - 使用 woocommerce_product_get_price Hook 结帐价格问题

android - 为什么不显示带有 setCustomContentView 的通知?

asp.net - 最简单的 ASP .NET AJAX 代理页面

javascript - 将事件绑定(bind)到 ajax 加载的内容

html - Flexbox 无法使 Woocommerce 按钮居中

iphone - 不会触发任何与方向相关的通知。为什么?

ios - 你能检测到 iCloud 何时更新吗?

javascript - 请求的资源上不存在 Access-Control-Allow-Origin header

wordpress - 使用 woocommerce 在 Wordpress 中进行基于订阅的访问