Отключить метод оплаты по условию
Добрый день!
Мне нужно для некоторых товаров отключить метод оплаты (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 раз значение. Дальше написать условие, если переменная уже изменена, не выполнять условие изменения результата.
Код примерно такой:
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; }