最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

woocommerce offtopic - Updaterefresh mini cart, after custom AJAX add_to_cart event

programmeradmin0浏览0评论

I need help

In my custom single-product.php template, I added the button

public function AddToCartButton() {
    global $product;

    if($product->is_type('variable') || $product->get_stock_status() !== 'instock') {
        $disabled_btn_class = 'btn-am--disabled';
    } else {
        $disabled_btn_class = '';
    }

    $echo = '<form class="cart single-product-cart" method="post" action="woocommerce_ajax_add_to_cart" enctype="multipart/form-data">';
    $echo .= '<button type="submit" class="single_add_to_cart_button button alt btn-am btn-am--red '. $disabled_btn_class .'" data-url="'. admin_url("admin-ajax.php").'"> ' . esc_html( $product->single_add_to_cart_text() ) .'</button>';
    $echo .= '<input type="hidden" name="add-to-cart" value="'. absint( $product->get_id() ) .'" />';
    $echo .= '<input type="hidden" name="product_id" value="'. absint( $product->get_id() ) .'" />';
    $echo .= '<input type="hidden" name="quantity" value="1" />';
    $echo .= '<input type="hidden" name="variation_id" class="variation_id" value="0" />';
    $echo .= '</form>';

    return $echo;
}

Custom AJAX call

public function __construct()
{
    add_action('wp_ajax_woocommerce_ajax_add_to_cart', [$this, 'ajax_add_to_cart']);
    add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', [$this, 'ajax_add_to_cart']);
}

function ajax_add_to_cart()
{
    $product_id         = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id']));
    $quantity           = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
    $variation_id       = absint($_POST['variation_id']);
    $passed_validation  = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity);
    $product_status     = get_post_status($product_id);

    if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id) && 'publish' === $product_status) {

        do_action('woocommerce_ajax_added_to_cart', $product_id);

        if ('yes' === get_option('woocommerce_cart_redirect_after_add')) {
            wc_add_to_cart_message(array($product_id => $quantity), true);
        }

    } else {

        $data = array(
            'error' => true,
            'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));

        echo wp_send_json($data);
    }

    wp_die();
}

This code works, and if refresh page, item added to cart, but this not work with hook woocommerce_add_to_cart_fragments

And in my functions.php I have this code for refresh update cart

add_filter( 'woocommerce_add_to_cart_fragments', 'wc_mini_cart_ajax_refresh' );
function wc_mini_cart_ajax_refresh( $fragments ) {
$fragments['#mcart-stotal'] = '<div id="mcart-stotal" class="mini-cart-footer__total">'.WC()->cart->get_cart_subtotal().'</div>';
ob_start();
echo '<div id="mcart-widget">';
woocommerce_mini_cart();
echo '</div>';
$fragments['#mcart-widget'] = ob_get_clean();

return $fragments;

}

And this hook works fine, but not for my custom AJAX button, why this happen?

发布评论

评论列表(0)

  1. 暂无评论