Category
Archives
Cocotiie
Trial And Error!やってみよう!の精神でWeb制作をしています。初心者の方にも伝わるよう、心がけています。少しでも誰かの助けになれれば嬉しいです。宜しくお願い致します。

2006年:Web制作に関する覚書きブログをはじめる。

2018年:Cocotiie(ココッティー)として運営開始。
このサイトは快適なテーマ「SWELL」を使用していますSWELLについて

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

WooCommerce

特定のカテゴリーに属する商品や、特定の商品の支払い方法を制限するカスタマイズをご紹介します。

たとえば、選べる支払い方法が銀行振込(bacs)又は小切手(cheque)の2種だとします。特定のカテゴリー内の品又は特定の商品を購入する際は、小切手(cheque)の選択肢を非表示にし、銀行振込(bacs)だけ表示する。といった具合です。

コードはfunction.phpに追記します。

INDEX

支払いID(参考まで)

いろいろありますが、私が使用していない物に関しては調べました。間違えていたらごめんなさい。

銀行振込bacs
小切手cheque
代引きcod
PayPalpaypal
Stripestripe

カテゴリーIDや商品IDの確認

カテゴリー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;
}
よかったらシェアお願いします
  • URLをコピーしました!
  • URLをコピーしました!

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

コメントする

INDEX