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

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

[ 이 글은 2016년도에 작성되었지만 최신 내용을 추가하여 재발행되었습니다. ]

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

이 글은 작성한 지 5년이 지나서 더 이상 기존에 소개한 방법이 최신 우커머스 버전에서는 작동하지 않는 것 같습니다. 대신 중복 구입을 비활성화하는 플러그인을 사용해볼 수 있습니다.

우커머스 중복 구매 비활성화 플러그인 - Woocommerce Disable Repeat Purchase

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

Woocommerce Disable Repeat Purchase 플러그인은 사용자가 이미 구매한 다운로드 가능 상품을 구입하지 못하도록 제한합니다. 또한, 상점 운영자가 다른 상품 유형을 직접 제한하고 싶은 경우 다른 상품 유형을 선택할 수 있는 부가적인 옵션이 제공됩니다.

우커머스 재구매 비활성화

이 플러그인은 유료 플러그인으로 다양한 상품 유형(예: 단순 상품, 다운로드 상품, 가상 상품, 옵션 상품 등)의 반복 구매를 방지하는 기능을 합니다.

다양한 기능이 있으므로 원하는 기능을 지원하는지 플러그인 판매자에게 문의해보시기 바랍니다.

사용자별 최대 상품 수 설정 플러그인 - Maximum Products per User for WooCommerce

사용자별 최대 상품 수 설정 플러그인 - Maximum Products per User for WooCommerce

Maximum Products per User for WooCommerce 플러그인은 무료 플러그인으로 우커머스 고객이 (평생 또는 선택한 날짜 범위 내에서) 구입할 수 있는 품목의 개수를 제한할 수 있습니다.

이 플러그인으로 각 사용자가 상품을 1개만 구입할 수 있도록 제한할 수 있다면 중복 상품 방지와 동일한 기능을 할 것 같습니다.

먼저 이 플러그인으로 원하는 기능을 구현할 수 있는지 확인해보시고, 안 되면 위에서 소개한 프리미엄 플러그인으로 가능한지 체크해보시기 바랍니다.

코드로 중복 구매 방지하기 (이전 내용 - 더 이상 작동하지 않는 것 같음)

이론상 고객이 특정 상품을 이미 구입했는지 여부를 체크하여 구입한 경우 재구매하지 못하도록 하면 됩니다. 이 작업을 위해서는 중복 구매를 제한할 상품의 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();
");
}

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

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

참고:


2개 댓글

  1. 안녕하세요. 워드프레스 우커머스를 이용해 쇼핑몰을 운영중인 사람입니다. 중복구매를 방지하기 위해 공유해주신 코드를 펑션파일에 추가해봤지만 적용이 되질 않더군요. 5년이 지난 포스팅이니 최신버전과 호환되지않을 가능성이 있을까요? 해결할 여력이 없어 염치불구하고 댓글을 남겨봅니다.

    1. 안녕하세요, condimang님. 알려주셔서 감사합니다. 아마 우커머스가 업데이트되면서 기존 코드가 작동하지 않는 것 같습니다. 대신 이와 같은 기능을 하는 플러그인이 나와 있는 것 같습니다. 본문을 업데이트했으니 참고하여 플러그인으로 구현 가능한지 체크해보시기 바랍니다.

댓글 남기기

* 이메일 주소는 공개되지 않습니다.