пользователь вращает колесо при оформлении заказа, все, на что он приземляется, добавляется к оформлению заказа, а также купон, позволяющий получить 100% скидку на этот продукт. Не вся корзина, а только этот товар. 3 из четырех предметов на вращающемся колесе являются реальными продуктами, а четвертая награда — купоном на скидку 20 %.
Колесо вращается и выглядит хорошо, проблема заключается в реальных функциях добавления корзина.
Код, который у меня сейчас есть, выводит из строя корзину меню.
Когда я открываю корзину при загрузке начальной страницы, она пуста (в корзине должно быть нет товаров). сообщение). но когда я добавляю товар в корзину, он отображается, а когда я удаляю его, сообщение отображается правильно.
когда я перезагружаю корзину или оформляю заказ, товары исчезают
купоны не добавляются к оформлению заказа автоматически.
Единственный способ получить товары при оформлении заказа - это на другой странице, а не на странице оформления заказа. Если я перезагружаю кассу, первоначальные элементы либо заменяются наградой за вращение колеса (все еще не могу получить скидку), либо корзина оказывается пустой.
php находится в файле function.php< /p>
Код: Выделить всё
// Check if a coupon exists
function coupon_exists($coupon_code) {
global $wpdb;
$sql = $wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_type = 'shop_coupon' AND post_name = %s", $coupon_code);
$coupon_codes = $wpdb->get_results($sql);
return count($coupon_codes) > 0;
}
// Generate a coupon if it doesn't exist
function generate_coupon($coupon_code, $discount_type = 'percent', $amount = '20', $expires_in_days = 1) {
$date_expires = date('Y-m-d', strtotime("+$expires_in_days days"));
$coupon = new WC_Coupon();
$coupon->set_code($coupon_code);
$coupon->set_discount_type($discount_type);
$coupon->set_amount($amount);
$coupon->set_date_expires($date_expires);
$coupon->save();
return $coupon_code;
}
// Apply coupon automatically to the cart
function apply_spin_coupons_to_cart($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
if (isset($_SESSION['spin_coupons']) && !empty($_SESSION['spin_coupons'])) {
foreach ($_SESSION['spin_coupons'] as $coupon_code) {
$coupon_code = sanitize_text_field($coupon_code);
if (!coupon_exists($coupon_code)) {
generate_coupon($coupon_code); // Ensure the coupon exists
}
// Apply the coupon to the cart
if (!in_array($coupon_code, $cart->get_applied_coupons())) {
$cart->apply_coupon($coupon_code);
}
}
}
}
add_action('woocommerce_cart_updated', 'apply_spin_coupons_to_cart', 20);
// Set the coupon codes in the session
function set_spin_coupons() {
if (isset($_POST['coupon_codes']) && is_array($_POST['coupon_codes'])) {
session_start();
$coupon_codes = array_map('sanitize_text_field', $_POST['coupon_codes']);
$_SESSION['spin_coupons'] = $coupon_codes; // Store multiple coupons in session
wp_send_json_success(['message' => 'Coupon codes set successfully']);
} else {
wp_send_json_error(['message' => 'No coupon codes provided']);
}
}
add_action('wp_ajax_set_spin_coupons', 'set_spin_coupons');
add_action('wp_ajax_nopriv_set_spin_coupons', 'set_spin_coupons');
// Debugging: Display session data in the footer
add_action('wp_footer', function () {
if (session_status() === PHP_SESSION_ACTIVE) {
echo '
Session Data: ' . print_r($_SESSION, true) . '';
}
});
// Start PHP session
function ensure_php_session_start() {
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
}
add_action('init', 'ensure_php_session_start', 1);
$(document).ready(function () {
const prizes = [
{ angle: 22.5, prize: "20% Off", type: "discount", code: "spin20" },
{ angle: 67.5, prize: "Basketball", type: "product", productId: 14256, coupon: "basketball100" },
{ angle: 112.5, prize: "Tote Bag", type: "product", productId: 14257, coupon: "totebag100" },
{ angle: 157.5, prize: "Mouse Pad", type: "product", productId: 4788, coupon: "mouse100" },
];
$("#spin-btn").click(function () {
const randomDegrees = Math.floor(Math.random() * 360) + 3600;
$("#wheel").css({
"transition": "transform 3s ease-out",
"transform": `rotate(${randomDegrees}deg)`
});
setTimeout(() => {
const finalAngle = randomDegrees % 360;
const prizeIndex = Math.floor(finalAngle / 45);
const prize = prizes[prizeIndex];
const coupons = [];
if (prize.type === "discount") {
coupons.push(prize.code);
}
if (prize.type === "product") {
$.post("/?wc-ajax=add_to_cart", { product_id: prize.productId, quantity: 1 }, function () {
alert(`Congratulations! You've won a ${prize.prize}. It has been added to your cart.`);
$(document.body).trigger("wc_fragment_refresh");
});
coupons.push(prize.coupon);
}
if (coupons.length > 0) {
$.post("/wp-admin/admin-ajax.php", {
action: "set_spin_coupons",
coupon_codes: coupons
}, function (response) {
if (response.success) {
alert("Your coupon(s) have been applied.");
$(document.body).trigger("wc_fragment_refresh");
}
});
}
}, 3000);
});
// Ensure cart fragments refresh
$(document.body).on("added_to_cart", function () {
$(document.body).trigger("wc_fragment_refresh");
});
});
цель вращения колеса заключается в следующем.
пользователь вращает колесо при оформлении заказа, Все, на что они попадают, добавляется к оформлению заказа, а также купон, дающий 100% скидку на этот продукт. Не вся корзина, а только этот товар. 3 из четырех предметов на колесе — настоящие товары, а четвертая награда — купон на скидку 20 %.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ally-addin