WooCommerceはWordPressに直接関連していないため、ここではあまり受け入れられていませんが、WooCommerceフォーラムでのサポートはそれほどひどいものであり、ここの人々は彼らが有能で知識豊富であることを証明したので試してみます。
私たちのクライアントは、特定のユーザーグループに対して特定の支払いゲートウェイを表示/非表示にしたいと考えています。 これが状況です:
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;
}
「小切手」は、請求書の支払いに使用される支払いゲートウェイの名前です。
まだ機能していないので、何が足りないのでしょうか。任意の助けは大歓迎です!
上記のコールバック関数にはいくつか問題があります。
global $woocommerce
を宣言していないので、$woocommerce
グローバル変数にアクセスすることはできません。$woocommerce->customer
はWC_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()
を使用できます。