سلام عزیزان وقتی یک محصول متغیر رو به سبد خرید اضافه میکنم از اون محصول دوتا اضافه میشه یکیش که دقیقا دارای متغیر های اعمال شده که البته درسته یکیشم از همون محصول بدون هیچ متغیری (این باگ فقط برای محصولات متغییره رخ میده)
اینم بگم فرایند افزودن محصول کاملا اجاکسی
هستش
$("form.cart").submit(function (e) {
e.preventDefault();
let cart_details = $(this).serialize();
const id = $(this).find('button[name="add-to-cart"]').val();
cart_details += "&product_id=" + id;
cart_details += "&action=_add_to_cart_action";
$product_name = $(this).closest("body").find("h1").text();
$.ajax({
type: "post",
data: cart_details,
beforeSend: function () {
loading();
},
success: function (data) {
if (data == true) {
Noti({
content: `
محصول
${$product_name}
با موفقیت به سبد خرید اضافه شد
`,
timer: 8000,
icon: "success",
});
updateCartCountStatus();
} else {
for (item in data) {
Noti({
content: data[item].notice,
status: "danger",
timer: 10000,
});
}
}
},
});
});
new AJAX('_add_to_cart_action', function () {
check_ajax_referer('ajax_security', '_wpnonce');
$product_id = sanitize_text_field($_REQUEST['product_id']);
$product_quantity = intval($_REQUEST['quantity']) == 0 ? 1 : intval($_REQUEST['quantity']);
$varidation_id = isset($_REQUEST['varidation_id']) ? $_REQUEST['varidation_id'] : null;
wc_clear_notices();
if (WC()->cart->add_to_cart($product_id, $product_quantity, $varidation_id)) {
wp_die(true);
} else {
wp_send_json(
wc_get_notices('error')
);
}
});
وقتی روی فرم افزودن به سبد خرید کلیک میکنم فقط ی درخاست اجاکس میره ولی دوتا محصول داخل سبد خرید ست میشه انگاری ی اکشن ووکامرس یجا هندل میشه
هرکی با این باگ روبه رو شده یکمکی بکنه هرجی داخل منابع خارجی گشتم هیچ چیز بدرد بخوری پیدا نکردم
داخل کلاس class-wc-form-handler.php
چندتا متد داریم که یکیشون مربوط به افزودن محصولات متغیر به کارت هستش وقتی از طریق اجاکس
میایم و میخایم محصول متغیر رو به سبد خرید اضافه کنیم در واقع یک محصول رو خودمون اضافه میکنیم یکیم خود ووکامرس اضافه میکنه برا همین این باگ رخ میده
add_filter('woocommerce_add_to_cart_handler', function ($type) {
if (($type === 'variable' || $type === 'variation') && $type !== 'simple') {
return;
}
}, 0, 1);
من ی فیلتر به فیلتر woocommerce_add_to_cart_handler
که داخل کلاس ذکر شده هستش زدم و جلوی اضافه کردن محصول رو توسط ووکامرس گرفتم
اینم کد کامل
namespace noghli\theme\ajax;
defined('ABSPATH') or exit;
class AJAX
{
public function __construct(string $action, callable $callback)
{
add_action("wp_ajax_$action", $callback);
add_action("wp_ajax_nopriv_$action", $callback);
}
}
add_filter('woocommerce_add_to_cart_handler', function ($type) {
if (($type === 'variable' || $type === 'variation') && $type !== 'simple') {
return;
}
}, 0, 1);
new AJAX('ql_woocommerce_ajax_add_to_cart', function () {
check_ajax_referer('ajax_security', '_wpnonce');
$product_id = absint($_REQUEST['product_id']);
$product_quantity = absint($_REQUEST['quantity']) == 0 ? 1 : wc_stock_amount($_REQUEST['quantity']);
$variation_id = isset($_REQUEST['variation_id']) ? $_REQUEST['variation_id'] : null;
wc_clear_notices();
if (WC()->cart->add_to_cart($product_id, $product_quantity, $variation_id)) {
wp_die(true);
} else {
wp_send_json(
wc_get_notices('error')
);
}
});
باتشکر از @Raymond عزیز بخاطر پیگیریش
درود خوبی...
کد زیر امتحان کنید:
add_action('wp_ajax_ql_woocommerce_ajax_add_to_cart', 'ql_woocommerce_ajax_add_to_cart');
add_action('wp_ajax_nopriv_ql_woocommerce_ajax_add_to_cart', 'ql_woocommerce_ajax_add_to_cart');
function ql_woocommerce_ajax_add_to_cart() {
$product_id = apply_filters('ql_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('ql_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('ql_woocommerce_ajax_added_to_cart', $product_id);
if ('yes' === get_option('ql_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('ql_woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id));
echo wp_send_json($data);
}
wp_die();
}
سلام ممنون کد رو استفاده کردم مشکل حل شد ی مشکل دیگه ایجاد کرد 😬
الان وقتی ی محصول متغیر رو به سبد خرید اضافه میکنم دوتا از محصول اضافه میشه یعنی quantity
دوبل میشه
چک کردم داخل درخواست آجاکس quantity مقدارش برابر با فیلد input quantity هستش ولی نمیدونم چرا دوبل میشه 🤔
وقتی کلا میام و کدهای سمت بک آند مربوط به افزودن به سبد خرید رو حذف میکنم و فقط درخواست رو ارسال میکنم کار میکنه و همهچی درسته ولی مشکل اینکه صفحه باید رفرش بشه انگار یجایی هربار که فرم cart سابمیت میشه ی اکشن زدن و اکشن خودکار اجرا میشه برا همین دوبار ست میشه
نظری دارید؟ 🥴
@ossvahid
یعنی هر بار محصول وارد سبد خرید میشه مقدار محصول برابر با 2 هست؟ 2 تا باشه قیمت افزایش پیدا می کنه درسته؟
سلام آره با کد خودم از محصول دوتا ساخته میشد ولی این کدی که شما دادین از محصول یکی میسازه ولی با quantity دو برابر
quality رو چک کردم داخل تب نتورک درسته یعنی مقدار quality برابر با مقدار فیلد quality هستش ولی نمیدونم چرا اینطوری میشه
@Raymond
اره قیمتشم دو برابر میشه
داخل کلاس class-wc-form-handler.php
چندتا متد داریم که یکیشون مربوط به افزودن محصولات متغیر به کارت هستش وقتی از طریق اجاکس
میایم و میخایم محصول متغیر رو به سبد خرید اضافه کنیم در واقع یک محصول رو خودمون اضافه میکنیم یکیم خود ووکامرس اضافه میکنه برا همین این باگ رخ میده
add_filter('woocommerce_add_to_cart_handler', function ($type) {
if (($type === 'variable' || $type === 'variation') && $type !== 'simple') {
return;
}
}, 0, 1);
من ی فیلتر به فیلتر woocommerce_add_to_cart_handler
که داخل کلاس ذکر شده هستش زدم و جلوی اضافه کردن محصول رو توسط ووکامرس گرفتم
اینم کد کامل
namespace noghli\theme\ajax;
defined('ABSPATH') or exit;
class AJAX
{
public function __construct(string $action, callable $callback)
{
add_action("wp_ajax_$action", $callback);
add_action("wp_ajax_nopriv_$action", $callback);
}
}
add_filter('woocommerce_add_to_cart_handler', function ($type) {
if (($type === 'variable' || $type === 'variation') && $type !== 'simple') {
return;
}
}, 0, 1);
new AJAX('ql_woocommerce_ajax_add_to_cart', function () {
check_ajax_referer('ajax_security', '_wpnonce');
$product_id = absint($_REQUEST['product_id']);
$product_quantity = absint($_REQUEST['quantity']) == 0 ? 1 : wc_stock_amount($_REQUEST['quantity']);
$variation_id = isset($_REQUEST['variation_id']) ? $_REQUEST['variation_id'] : null;
wc_clear_notices();
if (WC()->cart->add_to_cart($product_id, $product_quantity, $variation_id)) {
wp_die(true);
} else {
wp_send_json(
wc_get_notices('error')
);
}
});
باتشکر از @Raymond عزیز بخاطر پیگیریش
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟