====== 폼 처리에 관한 분석 ======
우커머스의 form submit 처리는 ''includes/class-wc-form-handler.php'' 파일의 ''WC_Form_Handler'' 클래스에서 정의된다. 이 클래스는 별도의 멤버 변수, 메소드를 정의하지 않는다. 모두 스태틱 메소드로 구성되어 있어, 파일 마지막에 단지 ''WC_Form_Handler::init();''로 모든 것을 해결한다.
''class-wc-form-handler.php'' 파일은 ''woocommerce.php'' 파일의 ''Woocommerce'' 클래스에서 추가된다.
Woocommerce::instance()
Woocommerce::__construct()
Woocommerce::includes()
Woocommerce::frontend_includes()
include_once( 'includes/class-wc-form-handler.php' ); // Form Handlers
WC_Form_Handler 클래스에서는 여러 폼 처리에 대해 정의를 하고 있다. 이 때 'wp_loaded' 액션으 콜백으로 폼 처리들이 수행되는데, URL 형태와 관계 없이 일반적인 리퀘스트를 처리할 수 있도록 디자인된 듯하다. 일례로,''add_to_cart_action'' 메소드는 폼으로 전달된 물품에 대해 장바구니에 집어 넣는 역할을 맡는다.
====== 세션에 대한 분석 ======
===== 서버 측 세션 =====
세션은 현재 로그인한 사용자가 로그인한 동안 가지게 되는 여러 상태에 대해 저장을 하는 값의 집합이다. 사용자가 로그아웃을 하면 세션 값은 파기되고, 다시 로그인을 하면 생성되는 구조로 되어 있다.
우커머스의 세션정보는 ''options'' 테이블에 일괄적으로 저장된다. 키의 이름은 ''_wc_session_{$user_id}'' 구조로 되어 있으니, 유저 아이디를 알면 해당 값을 데이터베이스에서 직접 추척할 수도 있다.
세션은 임시적인 값이므로 만기일이 지정되어 있다. 우커머스는 기본으로 세션을 만들게 되면 48시간 후에 만료되게 되어 있고 47시간 후에는 업데이트를 해야 함을 알리도록 디자인되어있다. 아래 코드는 ''includes/class-wc-session-handler.php'' 파일의 ''WC_Session_Handler::set_session_expiration()'' 메소드의 구현 부분이다.
public function set_session_expiration() {
$this->_session_expiring = time() + intval( apply_filters( 'wc_session_expiring', 60 * 60 * 47 ) ); // 47 Hours
$this->_session_expiration = time() + intval( apply_filters( 'wc_session_expiration', 60 * 60 * 48 ) ); // 48 Hours
}
우커머스는 sesion_expiring 부분이 현재 시간 보다 이전이면 세션을 다시 업데이트하도록 처리했다. 이것은 ''WC_Session_Handler::__construct()''를 참고하면 된다.
이 세션 만기 값은 ''options''에 별도로 저장된다. ''_wc_session_expires_{$user_id}'' 키로 저장되어 있으며, 값은 타임스탬프이다.
===== 클라이언트 측 세션 =====
클라이언트 측에서 세션에 대한 정보는 쿠키에서 관리한다. 우커머스에서 사용하는 세션에 대한 쿠키의 식별자는 ''wp_woocommerce_session_{COOKIEHASH}''이다. COOKIEHASH 값은 ''wordpress/wp-includes/default-constants.php'' ''wp_cookie_constants()'' 함수에서 관리된다. 여러 워드프레스 인스턴스 중에서 해당 사이트의 워드프레스를 인지할 때 사용할 수 있는 식별값이다. siteurl 정보를 md5 해시화하여 가지고 있다.
쿠키의 값은 4개의 필드를 가지며 '||' 문자를 통해 구분된다. 각각 아래와 같다.
- 해당 사이트의 유저 아이디
- 세션 만기 직전 값 (47시간 짜리)
- 세션 만기 값 (48시간 짜리)
- 쿠키의 내용의 해시 (salt + md5). 내용이 변조되지 않았는지를 체크한다.
====== 카트 (장바구니)에 대한 분석 ======
장바구니는 우선 사용자가 로그인되어 있을 경우 세션 정보로부터 읽어들인다. 그리고 해당 값은 별도의 user_meta 테이블에도 따로 기록된다. 세션 정보는 쿠폰 적용 등 사용자가 정말 마지막까지 운용중이었던 작업까지 기억하는 반면, user_meta 테이블에 별도로 저장되는 장바구니 정보에는 그러한 세세한 정보는 생략된다.
세션 정보가 아닌 user_meta 테이블에 저장되는 값은 다음과 같은 구조를 가지고 있다.
* 키: _woocommerce_persistent_cart
* 값: 시리얼라이즈 된 값. 키의 종류는 ''WC_Cart::$cart_session_data'' 멤버 변수를 참조하면 된다. 물론 이것이 전부라고는 단정할 수 없다. 현재 카트 정보는 'cart'라는 키의 값으로 저장된다. 각 항목은 카트의 정보에 따라 해시 값 => 실제 변수들 식으로 구성되어 있다.
아래는 한 예이다.
array(
'cart' => array(
'9bf31c7ff062936a96d3c8bd1f8f2ff3' => array( ... ),
'6f4922f45568161a8cdf4ad2299f6d23' => array( ... ),
),
);