WordPress WooCommerceで商品を重複して購入しないように設定する

Last Updated: 2023 年 07 月 17 日 2のコメント

WooCommerce(WooCommerce)商品の中から、特定の商品をユーザーが一度だけ購入するように制限したい場合があります。 例えば講義サイトから会員登録すると期間が限定されたり視聴回数が制限されお誘い(Trial)の講義を一度だけ購入するように制限する場合がこれに該当することができます。 この場合に利用できる方法です。

[この記事は、2016年度に作成されたが、最新の内容を追加して再発行されました。 ]

WordPress WooCommerceで商品を重複して購入しないように設定する

この記事は、作成したから5年が過ぎて、もはや既存に紹介した方法は、最新の WooCommerce バージョンでは動作しないようです。 代わりに、重複購入を無効にするプラグインを使用してみることができます。

WooCommerce 重複購入を無効にするプラグイン - Woocommerce Disable Repeat Purchase

WordPress WooCommerceで商品を重複して購入しないように設定する

Woocommerce Disable Repeat Purchaseプラグインは、ユーザーが既に購入したダウンロード可能商品を購入しないように制限します。 また、お店のオペレータが他の商品タイプを直接制限したい場合、他の商品の種類を選ぶことができる付加的なオプションが提供されます。

WooCommerce リピート無効

このプラグインは、有料のプラグインで様々な商品の種類(例えば、単純な商品、ダウンロード商品、バーチャルグッズ、オプション商品など)の繰り返しの購入を防止する機能をします。

様々な機能がありますので、必要な機能をサポートしている プラグイン販売にお問い合わせください。

ユーザーごとの最大の商品数の設定プラグイン - Maximum Products per User for WooCommerce

ユーザーごとの最大の商品数の設定プラグイン -  Maximum Products per User for WooCommerce

Maximum Products per User for WooCommerceプラグインは無料のプラグインで WooCommerce 顧客が(生涯または選択した日付の範囲内で)購入することができるアイテムの数を制限することができます。

このプラグインでは、各ユーザーが商品を1つだけ購入できるように制限することができれば、重複商品防止と同じ機能をするようです。

まず、このプラグインで必要な機能を実装することができるか確認した後、ならないと上で紹介したプレミアム・プラグインで可能かどうかチェックしてみてください。

コードで重複購入を防ぐ(以前のコンテンツ - これ以上機能しないようです)

理論上、顧客が特定の商品を既に購入しているかどうかをチェックして購入した場合、再購入できないようにします。 この作業のためには、重複購入を制限する商品のIDさえ分かればされます。

woocommerce_variation_is_purchasable フィルタと woocommerce_is_purchasable フィルタを使用して商品の追加データを渡すことができます。

まず、その商品が重複購入対象商品であることを確認した後、 wc_customer_bought_product 関数を使用して、顧客が重複購入禁止商品を以前に購入したことがあるかをチェックします。 wc_customer_bought_product 関数は、ユーザーがどのようなアイテムを購入したかを(電子メールまたはID、またはその両方により)チェックします(ここ を参照)。

使用している WordPress テーマの関数ファイル(の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. こんにちは。 WordPress WooCommerceを利用してショッピングモールを運営している人です。 重複購入を防止するために共有してくださったコードをファンクションファイルに追加してみたが適用さドゥェジルアンドグンヨ。 5年が過ぎた投稿だから、最新のバージョンと互換性がない可能性があるでしょう? 解決余力がないと仮定かかわらず、コメントを残してください。

    応答
    • こんにちは、condimang様。 お知らせいただきありがとうございます。 おそらく WooCommerceが更新され、既存のコードが動作していないようです。 代わりに、このような機能をするプラグインが出ているようです。 本文を更新したので参考にして、プラグインとして実装可能であるかチェックしてみてください。

      応答