سبد خرید ووکامرس چطور کار می کند؟

تاریخ: 25 اکتبر 2021

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

اصلی ترین محل مدیریت توسعه سبد خرید در ووکامرس، کلاس WC_Cart می باشد.

در بالاترین سطح، سبد خرید یک ویژگی کلاس ووکامرس در نظر گرفته شده و کل آبجکت سبد خرید در آن ریخته می شود.

با استفاده از دستور زیر به صورت عمومی به آن دسترسی خواهیم داشت:


WC()->cart

کلاس wc_cart چند بخش اساسی دارد:

  1. محتوای سبد خرید
  2. محصولات حذف شده از سبد
  3. کوپن های انجام شده بر روی سبد
  4. روش های حمل کالا
  5. هزینه کل سبد خرید
  6. سشن های سبد خرید
  7. فی های سبد خرید

سوال اول: ووکامرس سفارش کاربر میهمان در سبد خرید را در کجا نگهداری می کند؟

پاسخ کوکی مرورگر می باشد.

کافیست بعد از افزودن محصول به سبد خرید، متغیر COOKIE_$ را پرینت بگیریم.

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


Array
(
     [woocommerce_items_in_cart] => 1
     [wp_woocommerce_session_1e35...] => dssaae...
     [woocommerce_cart_hash] => 85d4d9...
)

پارامتر woocommerce_items_in_cart نشان دهنده تعداد آیتم های سبد خرید و پارامتر woocommerce_cart_hash معرف اختصاصی این سبد می باشد. (هر سبد یک hash اختصاصی دارد تا قابل تمایز باشد)

این دو پارامتر توسط متد set_cart_cookies ایجاد می شود:


private function set_cart_cookies( $set = true ) {
     if ( $set ) {
          $setcookies = array(
               'woocommerce_items_in_cart' => '1',
               'woocommerce_cart_hash' => WC()->cart->get_cart_hash(),
          );
          foreach ( $setcookies as $name => $value ) {
               if ( ! isset( $_COOKIE[ $name ] ) || $_COOKIE[ $name ] !== $value ) {
                    wc_setcookie( $name, $value );
               }
          }
     } else {
          $unsetcookies = array(
               'woocommerce_items_in_cart',
               'woocommerce_cart_hash',
          );
          foreach ( $unsetcookies as $name ) {
               if ( isset( $_COOKIE[ $name ] ) ) {
                    wc_setcookie( $name, 0, time() - HOUR_IN_SECONDS );
                    unset( $_COOKIE[ $name ] );
               }
          }
     }

     do_action( 'woocommerce_set_cart_cookies', $set );
}

 

همانطور که می بینیم، این متد هم می تواند کوکی های کارت را ایجاد کند و هم می تواند آن ها را حذف کند.

 

همچنین کوکی بعد با پیشوند wp_woocommerce_session توسط تابع set_customer_session_cookie ایجاد می شود. این پارامتر معرف اختصاصی این کاربر می باشد.


public function set_customer_session_cookie( $set ) {
     if ( $set ) {
          $to_hash = $this->_customer_id . '|' . $this->_session_expiration;
          $cookie_hash = hash_hmac( 'md5', $to_hash, wp_hash( $to_hash ) );
          $cookie_value = $this->_customer_id . '||' . $this->_session_expiration . '||' . 
$this->_session_expiring . '||' . $cookie_hash;
          $this->_has_cookie = true;

          if ( ! isset( $_COOKIE[ $this->_cookie ] ) || 
$_COOKIE[ $this->_cookie ] !== $cookie_value ) {
               wc_setcookie( $this->_cookie, $cookie_value, $this->_session_expiration,
 $this->use_secure_cookie(), true );
          }
     }
}

 

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

ولی هیچ کدام از این کوکی ها شامل محصولات سبد خرید نیستند.

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

فرض کنیم می خواهیم یک صفحه سبد خرید کاملا اختصاصی ایجاد نماییم.

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

همانطور که می دانیم ووکامرس سبد خرید را با شورتکد woocommerce_cart ایجاد می کند. پس تمام کاری که باید انجام شود رفتن به کالبک این شورتکد است.

برای یافتن اطلاعات شورتکدها باید سراغ کلاس اصلی شورتکدها یعنی کلاس wc-shortcodes برویم.

اگر متد init در این کلاس را مشاهده کنید، می بینید که تمام شورتکدهای ووکامرس به وسیله آن تولید می شود که یکی از آن ها شورتکد سبد خرید با نامک woocommerce_cart می باشد.

متدی که کالبک این شورتکد است، متد cart است که درون آن متد shortcode_wrapper وجود دارد و در نهایت به یک متد php با نام call_user_func می رسیم که ووکامرس به وسیله آن، کالبک شورتکدها را هندل می کند.

متد call_user_func از آن متدهایی هست که به ما امکان کال کردن متدها به صورت داینامیک را می دهد.

چون در این کلاس، شورتکد ها و کالبک آن را از یک آرایه تولید می کنیم، لذا لازم است از یک متد برای کال کردن داینامیک کالبک های شورتکد ها استفاده نماییم.

کالبک تمام شورتکدهای ووکامرس، یک کلاس می باشد.

مثلا کالبک شورتکد woocommerce_cart، کلاس WC_Shortcode_Cart  می باشد.

در ضمن، کلاس های کالبک شورتکدها در فولدر shortcodes در روت ووکامرس وجود دارد.

کلاس WC_Shortcode_Cart یک متد output دارد که در آن تمپلیت صفحه سبد خرید را لود می کند.

می دانیم که تمام تمپلیت های ووکامرس در فولدر templates در روت افزونه وجود دارند.

در این فولدر یک فولدر دیگر به نام cart وجود دارد که تمپلیت های صفحه سبد خرید در آن نگهداری می شود.

فایل اصلی تمپلیت سبد خرید ووکامرس، فایل cart.php می باشد.

اما هنگامی که وارد این تمپلیت می شویم، می بینیم که با متد get_cart، محصولات سبد خرید دریافت می شود:


foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

 

پس این متد وظیفه گرفتن محصولات از سبد خرید را دارد.

پس تا اینجا دانستیم که سه کوکی داریم و محصولات توسط متد get_cart استخراج می شوند.

متد get_cart نیز اطلاعات خود را از پراپرتی session می گیرد که توسط کلاس wc-session-handler ایجاد شده و در کلاس ووکامرس و پراپرتی session قرار می گیرد.

با پرینت کردن دستور زیر به راحتی می توانیم ببینیم که session ها و مخصوصا آنهایی که در سبد خرید موجود هستند، به صورت عمومی در آبجکت ووکامرس قابل دستیابی هستند:


WC()->session

 

اکنون دسترسی به محتوای سبد خرید توسط پراپرتی session و پراپرتی data_ و پراپرتی cart درون آن فراهم است.

اکنون می خواهیم بدانیم که محتوای پراپرتی cart چطور ساخته می شود.

 

 

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

نشانی ایمیل شما منتشر نخواهد شد.


طراحی افزونه وردپرس