web-dev-qa-db-ja.com

役割で利用可能なWooCommerce支払いゲートウェイをフィルタリングする

WooCommerceはWordPressに直接関連していないため、ここではあまり受け入れられていませんが、WooCommerceフォーラムでのサポートはそれほどひどいものであり、ここの人々は彼らが有能で知識豊富であることを証明したので試してみます。

私たちのクライアントは、特定のユーザーグループに対して特定の支払いゲートウェイを表示/非表示にしたいと考えています。 これが状況です:

  • ユーザグループA:得意先
  • ユーザグループB:会社

Bのみが請求書で支払うことができると想定されているので、商品を受け取った後。

これが私のこれまでのところです:

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {
   if ( isset( $available_gateways['authorize'] ) && $woocommerce->customer->get_role($role) <> 'Company' ) {
      unset( $available_gateways['authorize'] );
   } else if ( isset( $available_gateways['cheque'] ) && $woocommerce->customer->get_role($role) == 'Customer' ) {
      unset( $available_gateways['cheque'] );
}
   return $available_gateways;
}

「小切手」は、請求書の支払いに使用される支払いゲートウェイの名前です。

まだ機能していないので、何が足りないのでしょうか。任意の助けは大歓迎です!

2
theHubi

WooCommerceの質問に答えてください...賭けてすぐに彼を燃やしてください!

上記のコールバック関数にはいくつか問題があります。

  • あなたはglobal $woocommerceを宣言していないので、$woocommerceグローバル変数にアクセスすることはできません。
  • $woocommerce->customerWC_Customerクラスの状態を保持しますが、このクラスにはget_role()メソッドは含まれていません。さらに、コールバック内のどこにも$role変数の値を定義していないため、メソッドが存在しても機能しません。

代わりに、WP_Userオブジェクトに返されたroles配列のユーザーロールを調べます。

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_private' );

 function payment_gateway_disable_private( $available_gateways ) {

    $user = wp_get_current_user();

    if ( isset( $available_gateways['authorize'] ) && in_array('company', $user->roles) ) {
        unset( $available_gateways['authorize'] );
    } else if ( isset( $available_gateways['cheque'] ) && in_array('customer', $user->roles)  ) {
        unset( $available_gateways['cheque'] );
    }

   return $available_gateways;

}

注:ユーザーがログアウトしている場合、そのユーザーは役割を持たないため、そのことを考慮して、ユースケースに応じて買い物の前に最初にログインするようにユーザーをリダイレクトするなどの別の方法を使用できます。is_user_logged_in()を使用できます。

3
userabuser