Как в woocomerce включить способ оплаты только для определенных товаров по id?

Рейтинг: 0Ответов: 1Опубликовано: 13.06.2023

Как в woocomerce включить способ оплаты только для определенных товаров по id? На просторах интернета нашел способ включения для определенных категорий, но нужно еще и для конкретных товаров

add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_by_category', 25 );

function payment_gateway_by_category( $available_gateways ) {

  // в админке лучше ничего не делать
  if ( is_admin() ) {
    return $available_gateways;
  }

  $gateway_slug = 'wc_tinkoff_kvk'; // ярлык метода оплаты
  $is_available = true; // включен или выключен? по умолчанию – включен
  $cat_ids = array( 45, 47 ); // ID категорий товаров, для которых отключаем

  // цикл для содержимого корзины
  foreach ( WC()->cart->get_cart_contents() as $key => $value ) {
    // получаем все категории данного товара из корзины
    if( $product_cats = get_the_terms( $value[ 'product_id' ], 'product_cat' ) ) {
      foreach ( $product_cats as $product_cat ) {
        if ( in_array( $product_cat->term_id, $cat_ids ) ) {
          $is_available = false; // товар из заданной категории, отключаем метод оплаты
          break 2;
        }
      }
    }
  }

  // отключаем метод оплаты
  if ( false === $is_available ){
    unset( $available_gateways[ $gateway_slug ] );
  }

  return $available_gateways; // возвращаем результат

}

Ответы

▲ 0
<?php
add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_by_category', 25 );

function payment_gateway_by_category( $available_gateways ) {

    // в админке лучше ничего не делать
    if ( is_admin() ) {
        return $available_gateways;
    }

    $gateway_slug = 'wc_tinkoff_kvk'; // ярлык метода оплаты
    $is_available = true; // включен или выключен? по умолчанию – включен
    $cat_ids      = [ 45, 47 ]; // ID категорий товаров, для которых отключаем
    $product_ids  = [ 23, 55, 77 ]; // ID товаров, для которых отключаем

    // цикл для содержимого корзины
    foreach ( WC()->cart->get_cart_contents() as $value ) {
        $product_id = (int) $value['product_id'];

        if ( ! in_array( $product_id, $product_ids, true ) ) {
            $is_available = false; // товар с заданным ID, отключаем метод оплаты
            break;
        }

        // получаем все категории данного товара из корзины
        $product_cats = get_the_terms( $product_id, 'product_cat' );

        if ( ! $product_cats || is_wp_error( $product_cats ) ) {
            continue;
        }

        foreach ( $product_cats as $product_cat ) {
            if ( in_array( $product_cat->term_id, $cat_ids ) ) {
                $is_available = false; // товар из заданной категории, отключаем метод оплаты
                break 2;
            }
        }
    }

    // отключаем метод оплаты
    if ( ! $is_available ) {
        unset( $available_gateways[ $gateway_slug ] );
    }

    return $available_gateways; // возвращаем результат
}