Añadir al carro por ajax en WooCommerce

Añade al carro por ajax.

En este caso, por javascript habría que llamar a: anadirAlCarro(url)

Como parámetro se le pasa la url del producto.

Normalmente tendremos disponible el id además de la url, así que si tenemos el id, mejor cambiarlo y hacer la modificación sencilla en el código.

add_action('wp_ajax_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_woocommerce_ajax_add_to_cart', 'woocommerce_ajax_add_to_cart');

function woocommerce_ajax_add_to_cart() {
    
    $product_id = apply_filters('woocommerce_add_to_cart_product_id', url_to_postid(sanitize_text_field($_POST['product_url'])));
    $quantity = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']);
    $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) && '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);
        }
        
        WC_AJAX :: get_refreshed_fragments();
    } 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();
}

add_action('wp_head', 'ablancodev_script_add_cart');
function ablancodev_script_add_cart() {
    ?>  
    <script>
        function anadirAlCarro(p_url) {
		
			var data = {
				action: 'woocommerce_ajax_add_to_cart',
				product_url: p_url,
				product_sku: '',
				quantity: 1
			};

			jQuery.ajax({
				type: 'post',
				url: wc_add_to_cart_params.ajax_url,
				data: data,
				success: function (response) {

					if (response.error && response.product_url) {
						window.location = response.product_url;
						return;
					} else {
						$(document.body).trigger('added_to_cart', [response.fragments, response.cart_hash]);
					}
				},
			});

       }
	</script>   
    <?php
}
?>