[워드프레스] 우커머스에서 상품을 중복으로 구매하지 못하도록 설정하기

참고: 인기 테마인 BE 테마(33%)The 7(35%) 할인 행사를 진행하고 있습니다.
참고

우커머스(WooCommerce) 상품 중에서 특정 상품을 사용자들이 한 번만 구매하도록 제한하고 싶은 경우가 있을 수 있습니다. 가령 강의 사이트에서 회원으로 가입하면 기간이 제한되거나 시청 횟수가 제한된 맛보기(Trial) 강의를 한 번만 구입하도록 제한하는 경우가 여기에 해당될 수 있습니다. 이 경우에 이용할 수 있는 방법입니다.

이론상 고객이 특정 상품을 이미 구입했는지 여부를 체크하여 구입한 경우 재구매하지 못하도록 하면 됩니다. 이 작업을 위해서는 중복 구매를 제한할 상품의 ID만 알면 됩니다.

woocommerce_variation_is_purchasable 필터와 woocommerce_is_purchasable 필터를 사용하여 상품에 대한 추가 데이터를 넘겨줄 수 있습니다.

먼저 해당 상품이 중복 구매 대상 상품인지 확인한 후에, wc_customer_bought_product 함수를 사용하여 해당 고객이 중복 구매 금지 상품을 이전에 구매한 적이 있는지를 체크합니다. wc_customer_bought_product 함수는 사용자가 어떤 품목을 구입했는지를 (이메일이나 ID 또는 둘 다를 통해) 체크합니다(여기 참고).

사용 중인 워드프레스 테마의 함수 파일(functions.php)에 다음과 같은 코드를 추가하여 단순 상품 ID 혹은 옵션 상품 ID로 중복 구매를 방지할 수 있습니다.

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

그러면 옵션 상품에 대해서도 다른 옵션을 이미 구매한 경우 중복 구매가 안 된다는 메시지를 표시하게 됩니다.

전체 코드는 이 페이지를 참고하시기 바랍니다.

참고:



기부를 통해 이 블로그를 후원하실 수 있습니다.
워드프레스 설치/제작/문제해결이 필요한 경우 서비스(유료)를 요청해주세요.