WordPress как на ладони
rgbcode is looking for WordPress developers. eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

Отключить метод оплаты по условию

Добрый день!

Мне нужно для некоторых товаров отключить метод оплаты (woocommerce), все работает, за исключением одного мелочи. Код:

add_filter( 'woocommerce_available_payment_gateways', 'webmakitra_unset_gateway_by_category' );

function webmakitra_unset_gateway_by_category( $available_gateways ) {
	//if ( is_admin() ) return $available_gateways;
	if ( ! is_checkout() ) return $available_gateways;
	$unset = false;
	$posted = false;

	foreach( WC()->cart->get_cart() as $cart_item ) {

	$onlain_oplata = get_post_meta( $cart_item['product_id'], 'onlain-oplata', true );

		if ( $onlain_oplata == 'true' ) {

				$unset = true;
				break;
			}
	}

	if ( $unset == true ) {

		unset( $available_gateways['cod'] );
		if($posted != true){
				$page = jet_engine()->options_pages->registered_pages['shop-opt'];
				echo '<div class="inf-onl-opl">' . $page->get( 'pred-info-blok-v-checkuot' ) . '</div>';
				$posted = true;
		}
	}

	return $available_gateways;
}

В корзине один товар, а код трижды отрабатывает

echo '<div class="inf-onl-opl">' . $page->get( 'pred-info-blok-v-checkuot' ) . '</div>'

Мало того что вставляет это ифно два раза над методом оплаты, еще и один раз над billing info... Почему так происходит? В принципе если в корзине будет три товара, то все равно так будет выводить, как корректно сделать проверку - выводилось инфо или нет, чтобы один раз вывести?

Заметки к вопросу:
campusboy 5 месяцев назад

Почему Вы делаете это в фильтре? В фильтре ничего не должно выводиться на экран

0
lifeact
5 месяцев назад 3
  • 0
    Bo3gyX103 rwsite.ru

    В корзине один товар, а код трижды отрабатывает

    Фильтр может вызываться не 1 раз за запрос. Если внутри нужно сделать условие, которое должно срабатывать один раз за код, это можно сделать определив глобальную переменную (если код функциональный, как у вас) или статическое свойство (в ООП) и менять 1 раз значение. Дальше написать условие, если переменная уже изменена, не выполнять условие изменения результата.
    Код примерно такой:

    global $flag = false;
    add_filter( 'woocommerce_available_payment_gateways', 'webmakitra_unset_gateway_by_category' );
    function webmakitra_unset_gateway_by_category( $available_gateways ) {
    	global $flag;
    	if(false === $flag){
    		$flag = true;
    		// change available_gateways
    	} 
    
    	return $available_gateways;
    }
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация