Woocommerce — Страница продукта — Как создать AJAX на & quot; Добавить в корзину & ​​quot; кнопка?

Я хочу сделать кнопку «Добавить в корзину» на странице продукта, которая будет работать с AJAX. Как мне это сделать? Когда я добавляю в корзину на странице товара — она ​​обновляет страницу, как я могу заставить ее работать с помощью AJAX?

Кнопка «Добавить в корзину» на «Быстрый просмотр» в архиве работает от ajax — и это здорово, но как я могу сделать то же самое на странице продукта?

Я хочу нажать «Отвези меня домой» на странице продукта, которая затем
добавьте товар с выбранными атрибутами в мою корзину с помощью ajax и откройте эту корзину (как при наведении курсора на изображение сумки в меню) и потрясите изображение сумки.

13

Решение

Мы можем использовать ajax со страницы архива. это просто —

Удалить старую кнопку отправки формы:

remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );

Добавить ajax-ссылку со страницы архива на страницу отдельного продукта:

add_action( 'woocommerce_single_product_summary', 'woocommerce_template_loop_add_to_cart', 30 );

Постскриптум JS Callback. Например, вы можете показать всплывающее окно со ссылками «Вернуться в магазин» и «Корзина» или «Оформить заказ»

$('body').on('added_to_cart',function(){
// Callback -> product added
//$('.popup').show();
});
15

Другие решения

Пожалуйста, начните с чтения этой страницы:

http://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

Сначала вам нужно добавить код в ваш functions.php, например:

add_action( 'wp_ajax_add_foobar', 'prefix_ajax_add_foobar' );
add_action( 'wp_ajax_nopriv_add_foobar', 'prefix_ajax_add_foobar' );

function prefix_ajax_add_foobar() {
$product_id  = intval( $_POST['product_id'] );
// add code the add the product to your cart
die();
}

Затем вы должны добавить некоторый код JavaScript, который запускает добавление в корзину и вызывает функцию:

  jQuery( ".add-to-cart" ).each(function()
{var product_id = jQuery(this).attr('rel');
var el = jQuery(this);

el.click(function() {

var data = {
action: 'add_foobar',
product_id: product_id
};

jQuery.post('/wp-admin/admin-ajax.php' , data, function(response) {
if(response != 0) {
// do something
} else {
// do something else
}

});return false;

});

});

Это всего лишь пример того, как это можно сделать. Хотя это очень просто. Этот javascript проверяет ссылки с именем класса .add-to-cart и проверяет атрибут rel для соответствующего продукта. Затем он отправляет идентификатор продукта в класс php. Там нужно добавить код для добавления соответствующего товара в корзину.

Я предлагаю вам поискать больше по теме, чтобы она соответствовала вашим потребностям. Удачи.

7

информация: протестировано с WooCommerce 2.4.10.

Хм, ну, я сделал это по-другому, использовал цикл woocommerce из добавления в корзину (woocommerce / templates / loop / add-to-cart.php)

  global $product;

echo apply_filters( 'woocommerce_loop_add_to_cart_link',
sprintf( '<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" data-quantity="%s" class="button %s product_type_%s">%s</a>',
esc_url( $product->add_to_cart_url() ),
esc_attr( $product->id ),
esc_attr( $product->get_sku() ),
esc_attr( isset( $quantity ) ? $quantity : 1 ),
$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
esc_attr( $product->product_type ),
esc_html( $product->add_to_cart_text() )
),
$product );

НО проблема заключалась в том, что он добавлял только 1 количество, на самом деле, вы можете видеть в коде, который указан количество: 1, поэтому у меня были проблемы, пока я не столкнулся с это ребята, которые спасли меня

пс. оставив первую часть, где добавляется только 1 товар для людей, которым не нужно более 1 товара в корзину, но я добавил решение для тех, кому нужно больше, чем 1 товар, добавленный в корзину.

1

добавить к cart.js

jQuery( document ).on( 'click', '.product_type_simple', function() {

var post_id = jQuery(this).data('product_id');//store product id in post id variable
var qty = jQuery(this).data('quantity');//store quantity in qty variable

jQuery.ajax({
url : addtocart.ajax_url, //ajax object of localization
type : 'post', //post method to access data
data :
{
action : 'prefix_ajax_add_foobar', //action on prefix_ajax_add_foobar function
post_id : post_id,
quantity: qty
},

success : function(response){

jQuery('.site-header .quantity').html(response.qty);//get quantity
jQuery('.site-header .total').html(response.total);//get total

//loaderContainer.remove();
alert("Product Added successfully..");
}

});

return false;
});
0

Скопируйте этот код в свой файл. Например: моя-тематический туалет однозначных Ajax-добавить-cart.js.

function myThemeWc_SingleProductAddToCart(thisObj) {
if (typeof($) === 'undefined') {
var $ = jQuery.noConflict();
}

var thisForm = thisObj.closest('form');
var button = thisForm.find('.button');
var formUrl = thisForm.attr('action');
var formMethod = thisForm.attr('method');
if (typeof(formMethod) === 'undefined' || formMethod == '') {
formMethod = 'POST';
}
var formData = new FormData(thisForm[0]);
formData.append(button.attr('name'), button.val());

button.removeClass('added');
button.addClass('loading');

myThemeWc_SingleProductCartAjaxTask = $.ajax({
url: formUrl,
method: formMethod,
data: formData,
cache: false,
contentType: false,
processData: false
})
.done(function(data, textStatus, jqXHR) {
$(document.body).trigger('wc_fragment_refresh');

$.when(myThemeWc_SingleProductCartAjaxTask)
.then(myThemeWc_SingleProductUpdateCartWidget)
.done(function() {
button.removeClass('loading');
button.addClass('added');
setTimeout(function() {
button.removeClass('added');
}, 2000);
});
})
.fail(function(jqXHR, textStatus, errorThrown) {
button.removeClass('loading');
})
.always(function(jqXHR, textStatus, errorThrown) {
$('.cart').off('submit');
myThemeWc_SingleProductListenAddToCart();
});
}// myThemeWc_SingleProductAddToCartfunction myThemeWc_SingleProductListenAddToCart() {
if (typeof($) === 'undefined') {
var $ = jQuery.noConflict();
}

$('.cart').on('submit', function(e) {
e.preventDefault();
myThemeWc_SingleProductAddToCart($(this));
});
}// myThemeWc_SingleProductListenAddToCart/**
* Update WooCommerce cart widget by called the trigger and listen to the event.
*
* @returns {undefined}
*/
function myThemeWc_SingleProductUpdateCartWidget() {
if (typeof($) === 'undefined') {
var $ = jQuery.noConflict();
}

var deferred = $.Deferred();

$(document.body).on('wc_fragments_refreshed', function() {
deferred.resolve();
});

return deferred.promise();
}// myThemeWc_SingleProductUpdateCartWidgetvar myThemeWc_SingleProductCartAjaxTask;// on page load --------------------------------------------
jQuery(function($) {
$(document.body).on('wc_fragments_refreshed', function() {
console.log('woocommerce event fired: wc_fragments_refreshed');
});

myThemeWc_SingleProductListenAddToCart();
});

Возможно, вам придется заменить функцию, префикс переменной myThemeWc_ к тому, что вы хотите.

В этом коде используется оригинальная страница продукта WooCommerce для добавления кнопки в корзину, но остановите ее функционирование, а затем используйте ajax, оставив все значения в форме.

Затем поставьте в очередь этот файл js.

add_action('wp_enqueue_scripts', 'mythemewc_enqueue_scripts');
function mythemewc_enqueue_scripts() {
if (class_exists('\\WooCommerce') && is_product()) {
wp_enqueue_script('mythemewc-single-product', trailingslashit(get_stylesheet_directory_uri()) . 'assets/js/my-theme-wc-single-ajax-add-cart.js', ['jquery'], false, true);
}
}

Возможно, вам придется кодировать кнопку css, чтобы она отображала значок загрузки и добавления.
Вот ксс.

.woocommerce #respond input#submit.added::after,
.woocommerce a.btn.added::after,
.woocommerce button.btn.added::after,
.woocommerce input.btn.added::after,
.woocommerce .single_add_to_cart_button.added::after {
font-family: WooCommerce;
content: '\e017';
margin-left: .53em;
vertical-align: bottom;
}
.woocommerce #respond input#submit.loading,
.woocommerce a.btn.loading,
.woocommerce button.btn.loading,
.woocommerce input.btn.loading,
.woocommerce .single_add_to_cart_button.loading {
opacity: .25;
padding-right: 2.618em;
position: relative;
}
.woocommerce #respond input#submit.loading::after,
.woocommerce a.btn.loading::after,
.woocommerce button.btn.loading::after,
.woocommerce input.btn.loading::after,
.woocommerce .single_add_to_cart_button.loading::after {
font-family: WooCommerce;
content: '\e01c';
vertical-align: top;
font-weight: 400;
position: absolute;
right: 1em;
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
}
0

Вы можете повторить поведение кнопки архивирования в ваших продуктах.

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', 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);
}

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_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', 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);
}

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();
}

Вы можете увидеть полный учебник здесь

https://quadmenu.com/add-to-cart-with-woocommerce-and-ajax-step-by-step/

0
По вопросам рекламы [email protected]