[워드프레스] 우커머스에서 상품을 중복으로 구매하지 못하도록 설정하기
우커머스(WooCommerce) 상품 중에서 특정 상품을 사용자들이 한 번만 구매하도록 제한하고 싶은 경우가 있을 수 있습니다. 가령 강의 사이트에서 회원으로 가입하면 기간이 제한되거나 시청 횟수가 제한된 맛보기(Trial) 강의를 한 번만 구입하도록 제한하는 경우가 여기에 해당될 수 있습니다. 이 경우에 이용할 수 있는 방법입니다.
이론상 고객이 특정 상품을 이미 구입했는지 여부를 체크하여 구입한 경우 재구매하지 못하도록 하면 됩니다. 이 작업을 위해서는 중복 구매를 제한할 상품의 ID만 알면 됩니다.
woocommerce_variation_is_purchasable 필터와 woocommerce_is_purchasable 필터를 사용하여 상품에 대한 추가 데이터를 넘겨줄 수 있습니다.
먼저 해당 상품이 중복 구매 대상 상품인지 확인한 후에, wc_customer_bought_product 함수를 사용하여 해당 고객이 중복 구매 금지 상품을 이전에 구매한 적이 있는지를 체크합니다. wc_customer_bought_product 함수는 사용자가 어떤 품목을 구입했는지를 (이메일이나 ID 또는 둘 다를 통해) 체크합니다(여기 참고).
사용 중인 워드프레스 테마의 함수 파일(functions.php)에 다음과 같은 코드를 추가하여 할 수 있습니다.
function sv_disable_repeat_purchase( $purchasable, $product ) { // 중복 구매를 금지할 상품의 ID $non_purchasable = 356; // 현재 상품의 ID 체크 $product_id = $product->is_type( 'variation' ) ? $product->variation_id : $product->id; // 중복 구매 금지 상품의 ID와 일치하지 않는 경우 if ( $non_purchasable != $product_id ) { return $purchasable; } // 고객이 상품을 이전에 구매한 경우 False 반환 if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $product_id ) ) { $purchasable = false; } // 옵션 더블 체크: 상위 상품이 구매 불가능한 경우 옵션도 구매 불가능 if ( $purchasable && $product->is_type( 'variation' ) ) { $purchasable = $product->parent->is_purchasable(); } return $purchasable; } add_filter( 'woocommerce_variation_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 ); add_filter( 'woocommerce_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 ); // Source: SKYVERGE
위와 같은 코드로 중복 구매가 불가능하도록 지정한 상품을 재구매할 수 있도록 할 수 있습니다. 하지만 고객이 왜 해당 상품을 구매할 수 없는지를 알아야 할 것입니다.
woocommerce_single_product_summary 액션을 통해 이 메시지를 표시할 수 있습니다. 루프에서 글로벌 $product 개체에 접근하여 재구매 금지 상품의 ID와 비교합니다.
중복 구매 금지 상품의 페이지인지를 체크한 후에 고객이 이미 구매했다면 위의 함수를 통해 제품 구매가 비활성화(금지)되고 아래 함수를 통해 상품을 구매할 수 없다는 메시지를 출력하게 됩니다.
function sv_purchase_disabled_message() { // 중복 구매 금지 상품의 ID 입력 $no_repeats_id = 356; $no_repeats_product = wc_get_product( $no_repeats_id ); // 구매가 불가능한지를 체크하기 위해 현재 상품 정보를 가져옴 global $product; if ( $no_repeats_product->is_type( 'variation' ) ) { // 현재 상품 페이지가 구매 금지 상품의 상품 페이지가 아닌 경우 if ( ! $no_repeats_product->parent->id === $product->id ) { return; } // 구매 금지 상품 페이지에 있는 경우 메시지 출력 if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $no_repeats_id ) ) { sv_render_variation_non_purchasable_message( $product, $no_repeats_id ); } } elseif ( $no_repeats_id === $product->id ) { if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $no_repeats_id ) ) { // 고객에게 표시할 메시지 echo '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message">이 상품을 이미 구매하셨습니다. 이 상품은 한 번만 구매 가능합니다.</div></div>'; } } } add_action( 'woocommerce_single_product_summary', 'sv_purchase_disabled_message', 31 );
이제 단순 상품의 경우 고객에게 메시지를 통해 해당 상품을 구매할 수 없는 이유를 알려주게 됩니다.
옵션 상품의 경우 고객이 선택한 상품의 옵션에 따라 javascript를 사용하여 메시지를 조건에 따라 표시할 수 있습니다.
function sv_render_variation_non_purchasable_message( $product, $no_repeats_id ) { // 옵션 상품인지를 더블 체크함 if ( $product->is_type( 'variable' ) && $product->has_child() ) { $variation_purchasable = true; foreach ( $product->get_available_variations() as $variation ) { // ID와 일치하는 구매 금지 옵션에 대해서만 표시되는 메시지 if ( $no_repeats_id === $variation['variation_id'] ) { $variation_purchasable = false; // 고객에게 표시할 메시지 echo '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message js-variation-' . sanitize_html_class( $variation['variation_id'] ) . '">이 상품을 이미 구매하셨습니다. 이 상품은 한 번만 구매할 수 있습니다.</div></div>'; } } } // jQuery를 사용하여 옵션에 대하여 이 메시지를 표시하거나 표시하지 않음 if ( ! $variation_purchasable ) { wc_enqueue_js(" jQuery('.variations_form') .on( 'woocommerce_variation_select_change', function( event ) { jQuery('.wc-nonpurchasable-message').hide(); }) .on( 'found_variation', function( event, variation ) { jQuery('.wc-nonpurchasable-message').hide(); if ( ! variation.is_purchasable ) { jQuery( '.wc-nonpurchasable-message.js-variation-' + variation.variation_id ).show(); } }) .find( '.variations select' ).change(); "); }
그러면 옵션 상품에 대해서도 다른 옵션을 이미 구매한 경우 중복 구매가 안 된다는 메시지를 표시하게 됩니다.
전체 코드는 이 페이지를 참고하시기 바랍니다.
참고:
*일부 글에 제휴링크가 포함될 수 있습니다.기부를 통해 블로그 운영을 후원하실 수 있습니다.