Проблема меню редактирования Customizr Pro с некоторым пользовательским кодом Woocommerce

Я пытался спросить поддержку Customizr, что мой код работает, но они в основном сказали, что они не поддерживают сторонние плагины, такие как Woocommerce

Мне нужно было ограничить виды платежей в зависимости от того, что люди покупают на сайте. Например, тип оплаты Чек доступен только для людей, покупающих уроки.

Вот код, который делает это:

<?php
add_filter( 'woocommerce_available_payment_gateways', 
'threshold_unset_gateway_by_category' );

function threshold_unset_gateway_by_category( $available_gateways ) {
global $woocommerce;
$unset = false;
$category_ids = array( 22, 21, 25, 20);
foreach ( $woocommerce->cart->get_cart() as $key => $values ) {
    $terms = get_the_terms( $values['product_id'], 'product_cat' );    
    foreach ( $terms as $term ) {        
        if ( in_array( $term->term_id, $category_ids ) ) {
            $unset = true;
            break;
        }
    }
}
    if ( $unset == true ) unset( $available_gateways['cheque'] );
    return $available_gateways;
}

Я копался в файлах Customizr, но не могу найти никакого конфликта. Файлы Wordpress могут быть немного запутанными, поэтому я, возможно, лаю не то дерево.

2 ответа

Решение

Таким образом, решение этого было намного проще, чем я ожидал. Спасибо @LoicTheAztec за советы, я использовал код Лоика для лучшей оптимизации. Исправление состояло в том, чтобы проверить, является ли пользователь администратором

 if ( is_admin() ) {
        return $available_gateways;
    }

Затем поместите оставшуюся часть кода в else. Вот полное решение:

add_filter( 'woocommerce_available_payment_gateways', 'categories_unset_cheque_gateway', 99, 1 );
function categories_unset_cheque_gateway( $gateways ){
    if (is_admin()){
        return $gateways;
    }
    // BELOW define your categories in the array (can be IDs, slugs or names)
    else{
        $categories = array( 15 );
        // Loop through cart items checking for specific product categories
        foreach ( WC()->cart->get_cart() as $cart_item )
            if( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ){
                unset( $gateways['cheque'] );
                break; // Stop the loop
            }
        return $gateways;
        }   
    }

Этот ответ не предназначен для решения вашей проблемы с Customizr, я только что пересмотрел ваш код гораздо более легким, компактным и гибким способом.

Я также добавил приоритет и количество аргументов в add_filter() и это иногда решает странные вопросы...

Так что в этом коде я использую WP has_term() условная функция вместо:

add_filter( 'woocommerce_available_payment_gateways', 'categories_unset_cheque_gateway', 99, 1 );
function categories_unset_cheque_gateway( $gateways ){
    // BELOW define your categories in the array (can be IDs, slugs or names)
    $categories = array( 20, 21, 22, 25 );

    // Loop through cart items checking for specific product categories
    foreach ( WC()->cart->get_cart() as $cart_item )
        if( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ){
            unset( $gateways['cheque'] );
            break; // Stop the loop
        }

    return $gateways;
}

Код помещается в файл function.php активной дочерней темы (или активной темы).

Протестировано и работает (не тестировалось с Customizr Pro).

Другие вопросы по тегам