oss_vahid
12 ماه پیش توسط oss_vahid مطرح شد
5 پاسخ

باگ سبد خرید ووکامرس - کمک

سلام عزیزان وقتی یک محصول متغیر رو به سبد خرید اضافه میکنم از اون محصول دوتا اضافه میشه یکیش که دقیقا دارای متغیر های اعمال شده که البته درسته یکیشم از همون محصول بدون هیچ متغیری (این باگ فقط برای محصولات متغییره رخ میده)
 تصویر
اینم بگم فرایند افزودن محصول کاملا اجاکسی هستش

این کد جاوااسکریپته

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

کد php

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

وقتی روی فرم افزودن به سبد خرید کلیک میکنم فقط ی درخاست اجاکس میره ولی دوتا محصول داخل سبد خرید ست میشه انگاری ی اکشن ووکامرس یجا هندل میشه

هرکی با این باگ روبه رو شده یکمکی بکنه هرجی داخل منابع خارجی گشتم هیچ چیز بدرد بخوری پیدا نکردم

tnks

@Raymond


ثبت پرسش جدید
oss_vahid
تخصص : wp developer
@ossvahid 12 ماه پیش مطرح شد
2

بعد از تلاش زیاد و بررسی هسته ووکامرس مشکل برطرف شد اینجا میگم شاید زمانی بدرد کسی بخوره

داخل کلاس 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 عزیز بخاطر پیگیریش


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 12 ماه پیش مطرح شد
1

درود خوبی...
کد زیر امتحان کنید:

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

oss_vahid
تخصص : wp developer
@ossvahid 12 ماه پیش مطرح شد
0

سلام ممنون کد رو استفاده کردم مشکل حل شد ی مشکل دیگه ایجاد کرد 😬
الان وقتی ی محصول متغیر رو به سبد خرید اضافه میکنم دوتا از محصول اضافه میشه یعنی quantity دوبل میشه
چک کردم داخل درخواست آجاکس quantity مقدارش برابر با فیلد input quantity هستش ولی نمیدونم چرا دوبل میشه 🤔

وقتی کلا میام و کدهای سمت بک آند مربوط به افزودن به سبد خرید رو حذف میکنم و فقط درخواست رو ارسال میکنم کار میکنه و همهچی درسته ولی مشکل اینکه صفحه باید رفرش بشه انگار یجایی هربار که فرم cart سابمیت میشه ی اکشن زدن و اکشن خودکار اجرا میشه برا همین دوبار ست میشه

نظری دارید؟ 🥴

@Raymond


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 12 ماه پیش مطرح شد
0

@ossvahid
یعنی هر بار محصول وارد سبد خرید میشه مقدار محصول برابر با 2 هست؟ 2 تا باشه قیمت افزایش پیدا می کنه درسته؟


oss_vahid
تخصص : wp developer
@ossvahid 12 ماه پیش آپدیت شد
1

سلام آره با کد خودم از محصول دوتا ساخته می‌شد ولی این کدی که شما دادین از محصول یکی می‌سازه ولی با quantity دو برابر
quality رو چک کردم داخل تب نتورک درسته یعنی مقدار quality برابر با مقدار فیلد quality هستش ولی نمیدونم چرا اینطوری میشه
@Raymond
اره قیمتشم دو برابر میشه


oss_vahid
تخصص : wp developer
@ossvahid 12 ماه پیش مطرح شد
2

بعد از تلاش زیاد و بررسی هسته ووکامرس مشکل برطرف شد اینجا میگم شاید زمانی بدرد کسی بخوره

داخل کلاس 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 عزیز بخاطر پیگیریش


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام