Разрешить добавлять в корзину товары той же родительской категории для определенной роли пользователя в WooCommerce

#php #wordpress #function #if-statement #woocommerce

#php #wordpress #функция #if-оператор #woocommerce

Вопрос:

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

Но теперь мне нужно, чтобы этот код выполнялся только тогда, когда подключена определенная роль, в данном случае роль «Франчайзинга». Я изменил код и поставил условие, чтобы оно применялось только к роли «Франшиза», но оно не работает должным образом, по сути, ограничивает меня комбинацией категорий в «Франшизах», но в других ролях не позволяет мне добавлять товар в корзину и не является тем, что я хотите, должно быть разрешено нормально добавлять другие существующие роли и комбинировать продукты из разных категорий, предполагая, что вы устанавливаете условия для этих ограничений только в «Франшизе».

Я был бы признателен вам за помощь, пожалуйста

Вот моя попытка кода:

 $user = wp_get_current_user();

if ( in_array( 'franquicia', (array) $user->roles ) ) {

    function avoid_add_to_cart_from_different_main_categories( $passed, $product_id, $quantity ) {

        
        $cart      = WC()->cart;
        $taxonomy  = 'product_cat';
        $ancestors = [];

        if( $cart->is_empty() )
             return $passed;

        $terms = (array) wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'ids') );

        if( count($terms) > 0 ) {
            // Loop through product category terms  set for the current product
            foreach( $terms as $term) {
                foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
                    $ancestors[(int) $term_id] = (int) $term_id;
                }
            }

            // Loop through cart items
            foreach ( $cart->get_cart() as $item ) {
                $terms = (array) wp_get_post_terms( $item['product_id'], $taxonomy, array('fields' => 'ids') );
                if( count($terms) > 0 ) {
                    // Loop through product category terms set for the current cart item
                    foreach( $terms as $term) {
                        foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
                            $ancestors[(int) $term_id] = (int) $term_id;
                        }
                    }
                }
            }

            // When there is more than 1 parent product category
            if( count($ancestors) > 1 ) {
                wc_add_notice( __('Disculpa, NO puedes agregar a la misma orden/pedido productos que pertenezcan a distintas preventas o proveedores. Por favor, escoge solo productos que pertenezcan una misma preventa o proveedor.'), 'error' );
                $passed = false; 
            }
        }
        return $passed;
    }
}
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_from_different_main_categories', 10, 3 );
 

Я был бы признателен вам за помощь.

Ответ №1:

Вам необходимо использовать условие оператора user role IF внутри вашей функции следующим образом:

 function avoid_add_to_cart_from_different_main_categories( $passed, $product_id, $quantity ) {
    if( WC()->cart->is_empty() )
        return $passed;
        
    $user = wp_get_current_user();

    if ( in_array( 'franquicia', $user->roles ) ) {
        $taxonomy  = 'product_cat';
        $ancestors = [];

        $terms = (array) wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'ids') );

        if( count($terms) > 0 ) {
            // Loop through product category terms  set for the current product
            foreach( $terms as $term) {
                foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
                    $ancestors[(int) $term_id] = (int) $term_id;
                }
            }

            // Loop through cart items
            foreach ( WC()->cart->get_cart() as $item ) {
                $terms = (array) wp_get_post_terms( $item['product_id'], $taxonomy, array('fields' => 'ids') );
                if( count($terms) > 0 ) {
                    // Loop through product category terms set for the current cart item
                    foreach( $terms as $term) {
                        foreach( get_ancestors( $term, $taxonomy ) as $term_id ) {
                            $ancestors[(int) $term_id] = (int) $term_id;
                        }
                    }
                }
            }

            // When there is more than 1 parent product category
            if( count($ancestors) > 1 ) {
                wc_add_notice( __('Disculpa, NO puedes agregar a la misma orden/pedido productos que pertenezcan a distintas preventas o proveedores. Por favor, escoge solo productos que pertenezcan una misma preventa o proveedor.'), 'error' );
                $passed = false; 
            }
        }
    }
    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_from_different_main_categories', 10, 3 );
 

Код вводится functions.php файл активной дочерней темы (или активной темы). Это должно работать лучше.

Комментарии:

1. Я вставил код в functions.php , но это сгенерировало ошибку: functions.php : gyazo.com/141a92391478104c245598462a13332b ошибка: gyazo.com/25ed17217d641ad10358795d892513d8

2. Большое вам спасибо, все работает отлично, я вам очень благодарен. Если это не слишком затруднит, не могли бы вы сказать мне, что мне делать, если вместо одной роли я хочу разместить несколько ролей? например, автор и клиент. ПД: Извините за мой плохой английский.