نمایش پاپ آپ هنگام افزودن محصول به سبد خرید در ووکامرس – اگر تو هم از اون دسته افرادی هستی که با ووکامرس کار میکنی و دوست داری وقتی کاربران محصولی رو به سبد خرید اضافه میکنن، یه پاپآپ زیبا و کاربردی بهشون نشون بدی، این مقاله دقیقاً برای تو نوشته شده! 🎯
در این مقاله قراره با هم یه پاپ آپ جذاب و مدرن بسازیم که وقتی کاربر روی دکمه “افزودن به سبد خرید” کلیک میکنه، یه پاپ آپ شیشهای با انیمیشنهای نرم و روان بهش نمایش داده بشه. پس با من همراه باش تا قدم به قدم این کار رو انجام بدیم! 🚀
چرا نمایش پاپ آپ هنگام افزودن محصول به سبد خرید میتونه تجربه کاربری رو بهتر کنه؟🤔
وقتی کاربری محصولی رو به سبد خرید ووکامرسش اضافه میکنه، باید بلافاصله یه بازخورد واضح و سریع دریافت کنه تا مطمئن بشه عملش موفقیتآمیز بوده یا نه. اینجاست که پاپ آپها به کمکمون میان! 🛠️ یه پاپآپ عالی میتونه:
- تجربه کاربری رو ارتقا بده و سایتت رو حرفهایتر نشون بده. 💼
- تأیید کنه که محصول با موفقیت به سبد خرید اضافه شده. ✅
- تصویر و نام محصول رو نشون بده. 📸
- گزینههایی مثل ادامه خرید یا رفتن به سبد خرید رو پیشنهاد کنه. 🛍️
چطور این پاپ آپ رو در پیاده سازی کنیم؟ 🛠️
برای اینکه پاپآپ نمایش داده بشه، باید یه شناسه یا آیدی به دکمه افزودن به سبد خرید اختصاص بدیم. من آیدی buy
رو در نظر گرفتم، ولی تو میتونی هر آیدی دلخواهی بزاری.
📣 اینجا محل دیده شدن تبلیغ شماست کلیک کن AD
توجه! اگر میخواهی به طور خودکار شناسه (آیدی)
buy
رو به تمام دکمههای “افزودن به سبد خرید” اختصاص بدی و همچنین پاپ آپ به درستی نمایش داده بشه، باید کد PHP زیر رو در فایلfunctions.php
قالب خودت قرار بدی:
/* display a modal after adding a product to the cart By RayaWp.ir */
function add_custom_modal_script() {
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
const addToCartButtons = document.querySelectorAll('.add_to_cart_button, .single_add_to_cart_button');
addToCartButtons.forEach(button => {
button.id = 'buy';
button.addEventListener('click', async function(e) {
e.preventDefault();
const productContainer = button.closest('.product');
let productTitle, productImage, productId, quantity = 1;
const isSingleProduct = document.body.classList.contains('single-product');
if (productContainer && !isSingleProduct) {
productTitle = productContainer.querySelector('.woocommerce-loop-product__title')?.textContent
|| "<?php echo esc_js(get_the_title()); ?>";
productImage = productContainer.querySelector('.attachment-woocommerce_thumbnail')?.src
|| "<?php echo esc_url(get_the_post_thumbnail_url(get_the_ID(), 'thumbnail')); ?>";
productId = button.getAttribute('data-product_id')
|| "<?php echo get_the_ID(); ?>";
const quantityField = productContainer.querySelector('input.qty');
if (quantityField) {
quantity = parseInt(quantityField.value);
}
} else {
productTitle = "<?php echo esc_js(get_the_title()); ?>";
productImage = "<?php echo esc_url(get_the_post_thumbnail_url(get_the_ID(), 'thumbnail')); ?>";
productId = button.getAttribute('value') || "<?php echo get_the_ID(); ?>";
const quantityInput = document.querySelector('input.qty');
if (quantityInput) {
quantity = parseInt(quantityInput.value);
}
}
if (isNaN(quantity) || quantity <= 0) {
quantity = 1;
}
const modalOverlay = document.createElement('div');
modalOverlay.classList.add('custom-modal-overlay');
const modalContent = document.createElement('div');
modalContent.classList.add('custom-modal-content');
modalContent.innerHTML = `
<div class="glass-popup-content">
<div class="product-image-container">
<img src="${productImage}" alt="${productTitle}">
</div>
<div class="product-info">
<h3>${productTitle}</h3>
<div class="status-message">
<div class="loading-spinner"></div>
<p class="loading-text">در حال افزودن به سبد خرید...</p>
</div>
</div>
<div class="modal-buttons">
<button class="modal-button modal-cancel-button" style="display: none;">ادامه خرید</button>
<button class="modal-button modal-confirm-button" style="display: none;">متوجه شدم</button>
</div>
</div>
`;
modalOverlay.appendChild(modalContent);
document.body.appendChild(modalOverlay);
const statusMessage = modalContent.querySelector('.status-message');
const buttons = modalContent.querySelector('.modal-buttons');
const closeModal = function() {
if (document.body.contains(modalOverlay)) {
modalOverlay.classList.add('fade-out');
setTimeout(() => {
document.body.removeChild(modalOverlay);
document.removeEventListener('keydown', escHandler);
}, 300);
}
};
const escHandler = function(ev) {
if (ev.key === 'Escape') {
closeModal();
}
};
document.addEventListener('keydown', escHandler);
modalOverlay.addEventListener('click', function(ev) {
if (ev.target === modalOverlay) {
closeModal();
}
});
const confirmButton = modalContent.querySelector('.modal-confirm-button');
const cancelButton = modalContent.querySelector('.modal-cancel-button');
confirmButton.addEventListener('click', closeModal);
cancelButton.addEventListener('click', function() {
closeModal();
window.location.href = "<?php echo esc_url(wc_get_cart_url()); ?>";
});
try {
const formData = new FormData();
formData.append('product_id', productId);
formData.append('quantity', quantity);
formData.append('action', 'add_to_cart');
formData.append('security', '<?php echo wp_create_nonce("add-to-cart"); ?>');
console.log('Adding to cart:', {
product_id: productId,
quantity: quantity
});
const response = await fetch('<?php echo admin_url("admin-ajax.php"); ?>', {
method: 'POST',
credentials: 'same-origin',
body: formData
});
const result = await response.json();
if (response.ok && result.success) {
statusMessage.innerHTML = `
<p class="success-message">
<span class="success-icon">✓</span>
${quantity} عدد به سبد خریدت اضافه شد
</p>
`;
confirmButton.style.display = 'block';
cancelButton.style.display = 'block';
const cartCount = document.querySelector('.cart-count');
if (cartCount) {
const currentCount = parseInt(cartCount.textContent);
cartCount.textContent = currentCount + quantity;
}
} else {
statusMessage.innerHTML = `
<p class="error-message">
<span class="error-icon">✕</span>
${result.data?.message || 'خطا در افزودن محصول به سبد خرید.'}
</p>
`;
confirmButton.style.display = 'block';
confirmButton.textContent = 'متوجه شدم';
}
} catch (error) {
console.error('Error adding to cart:', error);
statusMessage.innerHTML = `
<p class="error-message">
<span class="error-icon">✕</span>
متاسفانه خطایی رخ داد. لطفا دوباره تلاش کنید.
</p>
`;
confirmButton.style.display = 'block';
confirmButton.textContent = 'تلاش مجدد';
confirmButton.onclick = () => window.location.reload();
}
});
});
});
</script>
<?php
}
add_action('wp_footer', 'add_custom_modal_script');
function add_custom_modal_styles() {
echo '<style>
.custom-modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
display: flex;
align-items: center;
justify-content: center;
z-index: 99999999;
opacity: 1;
transition: opacity 0.3s ease;
}
.custom-modal-overlay.fade-out {
opacity: 0;
}
.woocommerce-cart .cart-count {
display: none !important;
}
.custom-modal-content {
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
max-width: 400px;
width: 90%;
padding: 1rem;
animation: modalSlideIn 0.3s ease;
}
@keyframes modalSlideIn {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.glass-popup-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
.product-image-container {
width: 120px;
height: 120px;
border-radius: 25px;
overflow: hidden;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
.product-image-container img {
width: 100%;
height: 100%;
object-fit: cover;
}
.product-info {
text-align: center;
}
.product-info h3 {
font-size: 1.1rem;
color: #333;
margin-bottom: 0.5rem;
}
.quantity-info {
font-size: 1rem;
color: #666;
margin-bottom: 0.5rem;
}
.success-message, .error-message, .loading-text {
font-size: 1.2rem;
font-weight: bold;
margin-top: 1rem;
margin-bottom: 0.2rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.success-message {
color: #28a745;
}
.error-message {
color: #dc3545;
}
.success-icon, .error-icon {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
border-radius: 50%;
font-size: 14px;
}
.success-icon {
background: #28a745;
color: white;
}
.error-icon {
background: #dc3545;
color: white;
}
.loading-spinner {
width: 24px;
height: 24px;
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.modal-buttons {
display: flex;
justify-content: space-between;
width: 100%;
margin-top: 1rem;
}
.modal-button {
flex: 1;
padding: 0.5rem;
margin: 0 0.25rem;
border: none;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
}
.modal-confirm-button {
background: #f0f0f0;
color: #333;
}
.modal-confirm-button:hover {
background: #e0e0e0;
transform: translateY(-1px);
}
.modal-cancel-button {
background: rgba(40, 167, 69, 0.9);
color: white;
}
.modal-cancel-button:hover {
background: rgba(40, 167, 69, 1);
transform: translateY(-1px);
}
</style>';
}
add_action('wp_head', 'add_custom_modal_styles');
add_action('wp_ajax_add_to_cart', 'handle_add_to_cart');
add_action('wp_ajax_nopriv_add_to_cart', 'handle_add_to_cart');
function handle_add_to_cart() {
check_ajax_referer('add-to-cart', 'security');
$product_id = isset($_POST['product_id']) ? intval($_POST['product_id']) : 0;
$quantity = isset($_POST['quantity']) ? intval($_POST['quantity']) : 1;
if ($product_id <= 0) {
wp_send_json_error(['message' => 'شناسه محصول نامعتبر است.']);
wp_die();
}
if ($quantity <= 0) {
$quantity = 1;
}
$product = wc_get_product($product_id);
if (!$product) {
wp_send_json_error(['message' => 'محصول یافت نشد.']);
wp_die();
}
if ($product->managing_stock() && !$product->backorders_allowed()) {
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity < $quantity) {
wp_send_json_error(['message' => 'موجودی محصول کافی نیست. حداکثر تعداد موجود: ' . $stock_quantity]);
wp_die();
}
}
error_log('Adding to cart: Product ID: ' . $product_id . ', Quantity: ' . $quantity);
$added = WC()->cart->add_to_cart($product_id, $quantity);
if ($added) {
wp_send_json_success(['message' => 'محصول با موفقیت به سبد خرید اضافه شد.']);
} else {
wp_send_json_error(['message' => 'خطا در افزودن محصول به سبد خرید.']);
}
wp_die();
}
function get_cart_count() {
echo WC()->cart->get_cart_contents_count();
wp_die();
}
add_action('wp_ajax_get_cart_count', 'get_cart_count');
add_action('wp_ajax_nopriv_get_cart_count', 'get_cart_count');
function disable_wc_notices() {
return false;
}
add_filter('wc_add_to_cart_message_html', 'disable_wc_notices');
function add_custom_cart_count() {
if (function_exists('WC') && !is_null(WC()->cart)) {
$count = WC()->cart->get_cart_contents_count();
echo '<span class="cart-count">' . esc_html($count) . '</span>';
}
}
add_action('wp_footer', 'add_custom_cart_count');
function enqueue_custom_cart_scripts() {
wp_enqueue_script('custom-cart-js', get_template_directory_uri() . '/assets/js/custom-cart.js', array('jquery'), '1.0.0', true);
wp_localize_script('custom-cart-js', 'custom_cart_vars', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('add-to-cart'),
'cart_url' => wc_get_cart_url()
));
}
add_action('wp_enqueue_scripts', 'enqueue_custom_cart_scripts');
function clear_cart_on_specific_pages() {
$clear_cart_pages = array(123, 456);
if (is_page($clear_cart_pages) && !WC()->cart->is_empty()) {
WC()->cart->empty_cart();
}
}
add_action('template_redirect', 'clear_cart_on_specific_pages');
function rayawp_log($message) {
if (WP_DEBUG === true) {
if (is_array($message) || is_object($message)) {
error_log(print_r($message, true));
} else {
error_log($message);
}
}
}
function redirect_after_add_to_cart() {
return wc_get_cart_url();
}
function track_cart_abandonment() {
if (!is_user_logged_in() || WC()->cart->is_empty()) {
return;
}
$user_id = get_current_user_id();
$cart_contents = WC()->cart->get_cart_contents();
update_user_meta($user_id, '_abandoned_cart', $cart_contents);
update_user_meta($user_id, '_abandoned_cart_time', current_time('timestamp'));
}
add_action('wp_footer', 'track_cart_abandonment');
function rayawp_product_badge($product_id = null) {
if (!$product_id) {
global $product;
if (is_object($product)) {
$product_id = $product->get_id();
} else {
return '';
}
}
$badge = get_post_meta($product_id, '_custom_badge', true);
if (!empty($badge)) {
return '<span class="rayawp-badge">' . esc_html($badge) . '</span>';
}
return '';
}
function display_rayawp_badge() {
echo rayawp_product_badge();
}
add_action('woocommerce_before_shop_loop_item_title', 'display_rayawp_badge', 9);
add_action('woocommerce_before_single_product_summary', 'display_rayawp_badge', 9);
function rayawp_badge_css() {
echo '<style>
.rayawp-badge {
position: absolute;
top: 10px;
right: 10px;
background: #ff6b6b;
color: white;
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
font-weight: bold;
z-index: 9;
}
</style>';
}
add_action('wp_head', 'rayawp_badge_css');
جمع بندی🎉
با انجام این تغییرات، وقتی کاربر دکمه خرید رو فشار بده، پاپآپ تاییدی نمایش داده میشه که بهش میگه محصول به سبد خریدش اضافه شده. این کار به بهبود تجربه کاربری و افزایش اعتماد کاربران کمک میکنه. پس حالا وقتشه که این کدها رو اضافه کنی و تجربه خرید کاربران سایتت رو جذابتر کنی😎🚀
ارسال نظر ( 4 نظر تایید شده )
باسلام خدمت شما
quantityInput.value برای کد تعریف نشده. زمانیکه چندین مورد به سبد خرید اضافه میکنیم، صرفاً یک عدد به سبد خرید اضافه میکنه.
و اینکه حتماً باید درون این کد با استفاده js شرایط زیر هم تعریف بشه :
1. در صورتیکه مقدار ورودی بیشتر از موجود محصول بود.
2. در صورتیکه بصورت مثال مقادیری مثل -1 برای تعداد وارد شده بود.
سلام مهدی جان مرسی از تذکرت
کد مربوطه اصلاح شد و این ویژگی بهش اضافه شد
الان تعداد محصول رو هم به درستی اضافه میکنه 🙂
باتشکر از شما
چند مورد دیگه هم هست که وظیفه خودم دونستم به شما اطلاع بدم.
1. توی صفحه اصلی فروشگاه، وقتی محصولی از نوع متغییر هست، با کلیک بر روی دکمه (انتخاب گزینه ها) یک عدد به سبد خرید اضافه میکنه. در صورتیکه ابتدا می بایست متغییر انتخاب، سپس با زدن دکمه افزودن به سبد خرید پاپ آپ نمایش داده بشه.
2. در صفحه محصول متغییر، بعد از انتخاب متغییر و افزودن به سبد خرید، تعداد محصولی که در سبد خرید نمایش میده رو به روز نمیکنه و الزاماً باید یکبار صفحه رو رفرش کنیم تا تعداد موجود محصول در سبد خرید نمایش داده بشه.
3. در صفحه محصول متغییر، بعد از انتخاب متغییرها و افزودن به سبد خرید با ورود به صفحه سبد خرید متغییر افزوده شده را توی لیست قرار نمیده.
مرسی مهدی جان . در صورت امکان ممنون میشم کد اصلاحی رو برامون بفرستی تا در مقاله جایگزین بشه 🙂
📖 آنچه خواهید خواند
عاشق یادگیری و پیشرفت در برنامه نویسی و ارتقا مهارت هام هستم. سعی میکنم دانش و تجربیات ارزشمندم رو در رایا وردپرس باهاتون به اشتراک بزارم :)