Отключить метод оплаты по условию
Добрый день!
Мне нужно для некоторых товаров отключить метод оплаты (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... Почему так происходит? В принципе если в корзине будет три товара, то все равно так будет выводить, как корректно сделать проверку - выводилось инфо или нет, чтобы один раз вывести?
Почему Вы делаете это в фильтре? В фильтре ничего не должно выводиться на экран
Фильтр может вызываться не 1 раз за запрос. Если внутри нужно сделать условие, которое должно срабатывать один раз за код, это можно сделать определив глобальную переменную (если код функциональный, как у вас) или статическое свойство (в ООП) и менять 1 раз значение. Дальше написать условие, если переменная уже изменена, не выполнять условие изменения результата.
Код примерно такой: