[WooCommerce] 特定カテゴリー/商品の支払い方法を限定する方法

特定のカテゴリーに属する商品や、特定の商品の支払い方法を制限するカスタマイズをご紹介します。
たとえば、選べる支払い方法が銀行振込(bacs)又は小切手(cheque)の2種だとします。特定のカテゴリー内の品又は特定の商品を購入する際は、小切手(cheque)の選択肢を非表示にし、銀行振込(bacs)だけ表示する。といった具合です。
コードはfunction.phpに追記します。
INDEX
支払いID(参考まで)
いろいろありますが、私が使用していない物に関しては調べました。間違えていたらごめんなさい。
| 銀行振込 | bacs |
| 小切手 | cheque |
| 代引き | cod |
| PayPal | paypal |
| Stripe | stripe |
カテゴリーIDや商品IDの確認


カテゴリーや商品の編集ページのURLを見ると番号があります。後で必要になりますので、控えておいてください。
特定カテゴリー
add_filter( 'woocommerce_available_payment_gateways', 'unset_gateway_by_category' );
function unset_gateway_by_category( $available_gateways ) {
if ( is_admin() || ! WC()->cart ) {
return $available_gateways;
}
$category_ids = array( 61 ); // 制限したいカテゴリーID
$unset = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$terms = get_the_terms( $cart_item['product_id'], 'product_cat' );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
continue;
}
foreach ( $terms as $term ) {
if ( in_array( $term->term_id, $category_ids, true ) ) {
$unset = true;
break 2;
}
}
}
if ( $unset ) {
unset( $available_gateways['cheque'] ); // 小切手を非表示
}
return $available_gateways;
}複数のカテゴリーを制限したい場合は、array( 61,11 );とカンマで区切ります。
特定商品
add_filter( 'woocommerce_available_payment_gateways', 'unset_gateway_by_product_id' );
function unset_gateway_by_product_id( $available_gateways ) {
if ( is_admin() || ! WC()->cart ) {
return $available_gateways;
}
$target_product_ids = array( 2248 ); // 制限したい商品ID
$found = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( in_array( $cart_item['product_id'], $target_product_ids, true ) ) {
$found = true;
break;
}
}
if ( $found ) {
unset( $available_gateways['bacs'] ); //銀行振込非表示
}
return $available_gateways;
}
複数の商品を制限したい場合は、array( 61,11 );とカンマで区切ります。
バリエーションに対応
バリエーション設定をしている場合の特定商品だけに対応させる場合
add_filter( 'woocommerce_available_payment_gateways', 'unset_gateway_by_variation_id' );
function unset_gateway_by_variation_id( $available_gateways ) {
if ( is_admin() || ! WC()->cart ) {
return $available_gateways;
}
$target_variation_ids = array( 2249 ); // ← バリエーション#2249
$found = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
if (
! empty( $cart_item['variation_id'] ) &&
in_array( $cart_item['variation_id'], $target_variation_ids, true )
) {
$found = true;
break;
}
}
if ( $found ) {
unset( $available_gateways['cheque'] );
}
return $available_gateways;
}
if ( $found ) {
unset( $available_gateways['cheque'] );// 小切手を非表示
}
return $available_gateways;
}
商品とバリエーションの両方
商品(バリエーションがあっても丸ごと)と、特定のバリエーション(先の商品以外のバリエーション)を一緒に書く場合。
add_filter( 'woocommerce_available_payment_gateways', 'unset_gateway_by_product_id' );
function unset_gateway_by_product_id( $available_gateways ) {
if ( is_admin() || ! WC()->cart ) {
return $available_gateways;
}
$target_product_ids = array( 289 ); // 親商品
$target_variation_ids = array( 2249 ); // 特定バリエーション
foreach ( WC()->cart->get_cart() as $cart_item ) {
if (
in_array( $cart_item['product_id'], $target_product_ids, true ) ||
(
! empty( $cart_item['variation_id'] ) &&
in_array( $cart_item['variation_id'], $target_variation_ids, true )
)
) {
$found = true;
break;
}
}
if ( $found ) {
unset( $available_gateways['bacs'] ); //銀行振込非表示
}
return $available_gateways;
}

コメント ※ハンドルネームでお願いします