2017-10-13 4 views
1

この商品(新しいユーザーの商品)を登録して購入していない場合にのみ商品を表示したいと考えていました。まだWooCommerceで購入していない登録ユーザーに商品を表示する

この商品を一度購入すると、そのユーザーは購入できなくなります(ワンショット契約のため)。

これは私がそれを購入した後、その製品のURLに直接ナビゲートしようとするか、すべての製品などを検索しようとするようなことをするため、このアイテムは表示されません。

私が新しいユーザーで購入していない場合は、もちろん、どこにでも表示されます。

私は購入するかどうかを示すカスタムプロパティ(メタデータ)をユーザーに持っています。彼らはそれを購入した後、私はそれがもはや表示されないことを示すtrueにこのユーザーのフラグを設定します。

私は2つの質問持っていた:trueに項目の実際の成功購買にフック、そしてこのユーザフラグを設定する方法はあり

  1. を?
  2. フラグがtrueの場合、特定のユーザーに対してこの製品を表示しないようにWooに指示するにはどうすればよいですか。

ありがとうございました!

答えて

2

はい、これは3つの機能可能トラフである:

1)その顧客をチェックする条件関数は、特定の製品を購入しています:

function has_bought_items($user_id = 0, $product_id = 0) { 
    // The customer ID 
    $customer_id = $user_id == 0 || $user_id == '' ? get_current_user_id() : $user_id; 

    // Retrieve your customer flag '_has_bought_flag' (or replace it by your slug) 
    if (get_user_meta($customer_id, '_has_bought_flag', true)) 
     return true; 
    else 
     return false; 
} 

コードのfunction.phpファイルに行きますあなたのアクティブな子供のテーマ(またはテーマ)または任意のプラグインファイルにもあります。

2)ユーザーがログインしている場合のチェック、ショップやアーカイブページWP_Queryを変更しますpre_get_postsに夢中にカスタム関数彼はすでに、この特定の製品の購入した場合:

// Changing the WP_Query loop conditionally 
add_action('pre_get_posts', 'conditional_product_query', 10, 1); 
function conditional_product_query($q) { 

    // HERE set your product ID 
    $product_id = 37; 

    if(! is_user_logged_in() || has_bought_items('', $product_id)) 
     $q->set('post__not_in', array($product_id)); 
} 

条件がに一致すると、この製品はどこからでも完全に削除されます。

コードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、またはすべてのプラグインファイルに入ります。顧客のフラグがまだ存在しない場合、製品の順にあるとき

3)注文状況を取得する際に、顧客のフラグを設定しますwoocommerce_order_status_completedに夢中にカスタム関数は、「完了」:

// When Order get the "completed" status (paid) we check and we set the user flag (if necessary) 
add_action('woocommerce_order_status_completed', 'set_customer_specific_product_flag', 10, 2); 
function set_customer_specific_product_flag($order_id, $order) { 

    // HERE set your product ID 
    $product_id = 37; 

    // If customer has already bought the product we exit 
    if(has_bought_items($order->get_user_id(), $product_id)) return; 

    // Checking order items (if it match we update user meta data 
    foreach($order->get_items() as $product_item){ 
     if ($product_item->get_product_id() == $product_id){ 
      update_user_meta($order->get_user_id(), '_has_bought_flag', '1'); 
      break; 
     } 
    } 
} 

コードは、アクティブな子テーマ(またはテーマ)のfunction.phpファイル、またはすべてのプラグインファイルに入ります。

このコードはWoocommerce 3+でテストされており、動作します(以前のバージョンでも動作するはずです)。


関連の答え:Checking if customer has already bought something in WooCommerce

+0

私は私のためにこれを書くために時間を取り出すために十分に感謝することはできません。メルシ! – NullHypothesis

+0

ちょっと@loictheaztecこれはほとんどどこにでも隠れていますが、/ shop URLにアクセスすると(直接アクセスすることもできますし、ショッピングカートのセッションが切れて、新製品をもう一度追加するように求められる場合)、2行表示します。最初の行にはすべての自分の製品が含まれ、2番目の行には、非表示にするすべての製品が含まれています。最初の行がなぜ2番目の隠しが表示されているのかわからない - 別のループやフックをここに隠す必要があるのだろうか?その/店のエンドポイントはまだ製品を引っ張っているようだ – NullHypothesis

関連する問題