誰かが私の子供の関数ファイルで製品を購入した後に、このようなことをして機能を追加できますか?私はs2memberとwoocommerceを使用しており、私は初心者です。
add_action( 'cap_added'、 'change_user_cap_with_purchase'、1); function change_user_cap_with_purchase($ order_id){ $ order = wc_get_order($ order_id); foreach($ order-> get_items()as $ item){ //製品ID if($ item ['product_id'] == 999){ function add_cap_to_role(){ $ customer = get_role( 'customer '); $ customer-> add_cap(' cst11 '); } } }
最初に、WordPressサイトのユーザーに機能を追加することを指定しました。これは、役割に機能を追加することとは対照的です。ユーザーについての詳細 ここにあります 。)これが初めてなので、指摘したいと思います。
第二に、コードに。注文プロセスがどのように見えるのかわからないので、どのフックを使用するかについてアドバイスできません。 WooCommerceはそのプロセスに膨大な数の エントリーポイント を提供しています。議論のために、サイトのユーザーが注文の支払いを完了したときに機能を追加するとします。このような場合、WC_Order->payment_complete()
メソッドが呼び出されたときにWooCommerceプロセスに入ることができます。 woocommerce_payment_complete アクションフックを使用できます(フックの使用方法はすでに知っています)。
add_action( 'woocommerce_payment_complete'、 'bucktastic_adds_cap'); function bucktastic_adds_cap($ order_id){...}
このフックは、フックのコールバック関数で使用される WC_Order の注文番号を渡します。次に、この注文番号を使用して、問題の注文を操作する必要があります。それでは、注文を操作できるように grab 注文オブジェクトにしましょう(そして、その方法も知っています)。
$ order = wc_get_order($ order_id);
これはFALSE
を返す可能性があるため、スクリプトを続行する前に確認する必要があります。しかし、注文オブジェクトを取得するとします。次に行うことは、顧客のWordPress=ユーザーを取得することです。 ドキュメント によると、WC_Orderにはユーザーを返す素敵な小さな関数があります私たちのサイトの WP_User 、注文に関連付けられている人:
$ user = $ order-> get_user();
繰り返しますが、この関数はFALSE
を返す可能性があるため、それを確認する必要があります。これでユーザーオブジェクトができたので、その用途に機能を追加できます。 (すでにWP_User->add_cap()
メソッドの使用方法を知っており、_cst11
_機能をWebサイトユーザーに追加することをお勧めします。)すべてをまとめる...
add_action( 'woocommerce_payment_complete'、 'bucktastic_adds_cap'); function bucktastic_adds_cap($ order_id){ //注文を取得しますが、注文番号が無効です $ order = wc_get_order($ order_id); if($ order === FALSE)return; //ユーザーを取得ユーザーが見つからない場合は続行しないでください $ user = $ order-> get_user(); if($ user === FALSE)return; // bucktasticのWebサイトユーザーに機能を追加します。 $ user-> add_cap( 'cst11'); }
あなたのコードはあなたがあなたの質問で述べているよりも多くの助けを求めていることを表しているので、私はあなたのためにいくつかの質問があります。
1.)すべてのリストアイテムを繰り返し処理し、機能を追加する前にアイテム番号を確認するのはなぜですか?ユーザーが特定のアイテムを購入した場合にのみ、ユーザーに機能を追加しようとしていますか?
2.)注文のアイテムを反復するたびに機能を追加するために関数add_cap_to_role()
を再定義するのはなぜですか? (これは間違いなくエラーをスローします。しかし、それはPHPをコーディングしているので、コーディング方法の基本的な理解があり、すでにこれを知っています。)
3.)機能を追加するために関数を呼び出す必要があるのはなぜですか? (それがコールバック関数の目的であり、フック以外の場所で使用できるため、まったく同じことを実行する別の関数を作成するのは不適切なコーディング方法です。)
4.)個々のユーザーアカウントに機能を追加する場合、購入のたびに役割を操作しようとするのはなぜですか? (なぜ私がこの質問をしているのかについての明確さについては、私の冒頭の声明を参照してください。)
編集:ここにリンクがあります より多くの可能なヘルプへ。