Я пытаюсь изменить содержимое div каждый раз, когда что-то добавляется в корзину woocommerce. Для этого примера содержимое будет соответствовать текущей общей стоимости корзины.
Итак, сначала я создал простой плагин под названием «test-cart-value», который содержит следующий код:
<?php
function test_cart_value() {
echo "<div>" . WC()->cart->total . "</div>";
}
add_shortcode('test_cart_value_shortcode', 'test_cart_value');
Это прекрасно работает, где бы я ни размещал шорткод, я получаю текущее значение корзины после загрузки страницы.
Итак, теперь я хочу, чтобы это печатное значение обновлялось каждый раз, когда что-то добавлялось в корзину, без перезагрузки страницы. Идея состояла в том, чтобы использовать ловушку действия woocommerce_cart_updated и вызывать функцию - поэтому каждый раз, когда что-то в корзине меняется, отображается новое значение корзины:
function action_woocommerce_cart_updated() {
test_cart_value();
};
// add the action
add_action( 'woocommerce_cart_updated', 'action_woocommerce_cart_updated', 10, 0 );
Проблема в том, что теперь я не могу динамически добавить товары в корзину. Всякий раз, когда я нажимаю кнопку «Добавить в корзину», анимация загрузки загружается вечно. Как это сделать правильно? Я пробовал разные подходы с Ajax и разными хуками, но пока ничего не получалось.
Есть идеи? Заранее спасибо!
Редактировать:
Так что я попробовал это как мой код плагина
function test_cart_value() {
echo "<div id='cart_test'>" . WC()->cart->total . "</div>";
}
add_shortcode('test_cart_value_shortcode', 'test_cart_value');
// define the actions for the two hooks created, first for logged in users and the next for logged out users
add_action("woocommerce_cart_updated", "cart_update");
// define the function to be fired for logged in users
function cart_update() {
$cart = WC()->cart->total;
$result['type'] = "success";
$result['new_cart'] = $cart;
$result = json_encode($result);
//if I uncomment the "die" function, the page won't load
// die();
}
// Fires after WordPress has finished loading, but before any headers are sent.
add_action( 'init', 'script_enqueuer' );
function script_enqueuer() {
// Register the JS file with a unique handle, file location, and an array of dependencies
wp_register_script( "test_script", plugin_dir_url(__FILE__).'test_script.js', array('jquery') );
// localize the script to your domain name, so that you can reference the url to admin-ajax.php file easily
wp_localize_script( 'test_script', 'myAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
// enqueue jQuery library and the script you registered above
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'test_script' );
}
И мой test_script. js код:
jQuery(document).ready( function() {
jQuery(".ajax_add_to_cart").click( function(e) {
e.preventDefault();
jQuery.ajax({
type : "post",
dataType : "json",
url : myAjax.ajaxurl,
data : {action: "cart_update"},
success: function(response) {
if(response.type == "success") {
jQuery("#cart_test").html(response.new_cart);
}
else {
alert("Your like could not be added");
}
}
});
});
});
Поэтому я подумал, что функция cart_update () должна срабатывать при нажатии кнопки «ajax_add_to_cart», но я получаю ошибку 400.
Есть идеи? Спасибо!