افزودن به سبد خرید ووکامرس از نظر برنامه نویسی

تاریخ: 07 اردیبهشت 1400

زمانی که بر روی دکمه افزودن به سبد خرید ووکامرس کلیک می شود، اتفاقات بسیاری رخ می دهد.

بازیگر اصلی این قضیه، متد add_to_cart از کلاس WC_Cart می باشد.

اما قبل از این اتفاق، باید یک درخواست و یک هندلر وجود داشته باشد.

چون درخواست افزودن به سبد خرید به صورت ajax رخ می دهد، پس کلاس WC_AJAX باید نقش داشته باشد.

در کلاس WC_AJAX یک متد add_to_cart داریم که وظیفه ی هندل کردن درخواست را بر عهده دارد.

بررسی فرآیند هندلر افزودن به سبد خرید

گفتیم که متد add_to_cart در کلاس WC_AJAX وظیفه ی هندل کردن درخواست افزودن به سبد خرید را دارد. در این بخش نگاهی گذرا به فرآیندی که در این متد صورت می گیرد انجام می دهیم

برای مشاهده این متد به لینک زیر مراجعه نمایید:

https://github.com/woocommerce/woocommerce/blob/ef61092ebdef2887a95c87cb36488fefcb92e4c1/includes/class-wc-ajax.php#L400

 

1- ob_start برای ذخیره خروجی در بافر سمت سرور

ob_start();

 

2- failed کردن درخواست در صورت ارسال نکردن product_id

if ( ! isset( $_POST['product_id'] ) ) {
    return;
}

 

3- ست کردن product_id از درخواست

$product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $_POST['product_id'] ) );

 

4- ست کردن محصول با متد wc_get_product با استفاده از product_id

$product = wc_get_product( $product_id );

 

5- ست کردن quantity از درخواست

$quantity = empty( $_POST['quantity'] ) ? 1 : wc_stock_amount( wp_unslash( $_POST['quantity'] ) );

 

6- چک کردن protected بودن یا نبودن محصول (محصول هیدن نباشد)

$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );

 

7- ست کردن وضعیت محصول با متد get_post_status با استفاده از product_id (محصول منتشر شده باشد)

$product_status = get_post_status( $product_id );

 

8- اگر محصول ما variation نبود مقدار variation و variation_id نداریم ولی اگر محصول ما variation بود، باید مقادیر را ست کنیم.

$variation_id = 0;
$variation = array();

 

9- چک کردن محصول متغیر یا غیر متغیر

if ( $product && 'variation' === $product->get_type() ) {

 

10- برای محصول متغیر، variation_id برابر product_id ست می کنیم.

$variation_id = $product_id;

 

11- برای محصول متغیر، variation با متد get_variation_attributes از آبجکت product$ ست می شود.

$variation = $product->get_variation_attributes();

 

12- چک نهایی برای افزودن به کارت شامل، هیدن نبودن محصول، افزودن صحیح کارت به سبد و منتشر شده بودن محصول.

if ( $passed_validation && false !== WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ) && 'publish' === $product_status ) {

 

13- ست کردن قلاب برای لحظه ی افزودن محصول به سبد.

do_action( 'woocommerce_ajax_added_to_cart', $product_id );

 

14- ایجاد پیام افزوده شدن به سبد اگر در تنظیمات ست کرده باشیم که بعد از افزودن به سبد ریدایرکت شود

if ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) {
wc_add_to_cart_message( array( $product_id => $quantity ), true );
}

 

15- کال کردن متد get_refreshed_fragments که وظیفه ی آپدیت کردن مینی کارت و برگرداندن fragment و cart_hash را بر عهده دارد.

self::get_refreshed_fragments();

 

16- تولید خطا اگر محصول به سبد اضافه نشود. یا محصول هیدن باشد یا محصول منتشر شده نباشد.

$data = array(
'error' => true,
'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id ),
);

 

17- برگرداندن خطا به ajax

wp_send_json( $data );

دیدگاهتان را بنویسید