Title: Restriccion de productos por categoria y rol de usuario
Last modified: 10 de diciembre de 2020

---

# Restriccion de productos por categoria y rol de usuario

 *  [vsalazar2101987](https://es.wordpress.org/support/users/vsalazar2101987/)
 * (@vsalazar2101987)
 * [hace 5 años, 10 meses](https://es.wordpress.org/support/topic/restriccion-de-productos-por-categoria-y-rol-de-usuario/)
 * Hola, necesito orientación con respecto a un código. Actualmente me funciona 
   de forma correcta. El código lo que hace es restringir la combinación de producto
   de categorías diferentes, es decir, solo que puede agregar al carrito producto
   de una sola categoría a la vez.
 * pero ahora necesito que solo se ejecute este código cuando esta conectado un 
   rol especifico, en este caso, rol «Franquicia». Yo modifique el código, y coloque
   la condición para que solo aplique al rol “Franquicia”, pero no funciona correctamente,
   en efecto, me restringe la combinación de categoría en “Franquicias”, pero en
   los demás roles no me permite agregar producto al carrito y no es lo que quiero,
   debería dejar que agregue normalmente en los otros roles existente, y combinar
   productos de distintas categorias, al suponerse que se esta condicionando para
   que esas restricciones solo sucedan en “Franquicia”.
 * Agradeceria mucho su ayuda por favor
 *     ```
       $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 );
       ```
   

Viendo 1 respuesta (de un total de 1)

 *  [Héctor Prieto](https://es.wordpress.org/support/users/priethor/)
 * (@priethor)
 * [hace 5 años, 10 meses](https://es.wordpress.org/support/topic/restriccion-de-productos-por-categoria-y-rol-de-usuario/#post-12192101)
 * ¡Hola!
 * Por lo que veo en el código, parece que el hook no devuelve nada si no entra 
   en el `if` (es decir, si no tiene el rol ‘franquicia’). Si todos los demás roles
   deben poder añadir productos sin ejecutar la validación, deberías devolver true
   en ese caso.
 * Puedes añadir `return true;` entre las dos llaves `}` finales, aunque en su lugar
   te recomiendo usar el [patrón return early](https://medium.com/swlh/return-early-pattern-3d18a41bba8)
   y dejar la comprobación inicial así:
 *     ```
       $user = wp_get_current_user();
       if ( ! in_array( 'franquicia', (array) $user->roles ) ) {
           return true;
       }
   
       function avoid_add_to_cart_from_different_main_categories( $passed, $product_id, $quantity ) {
       ...
       ...
       ...
           return $passed;
       }
       add_filter( 'woocommerce_add_to_cart_validation', 'avoid_add_to_cart_from_different_main_categories', 10, 3 );
       ```
   
 * ¡Un saludo!
    -  Esta respuesta fue modificada hace 5 años, 10 meses por [Héctor Prieto](https://es.wordpress.org/support/users/priethor/).
      Razón: Añadidos más puntos suspensivos
    -  Esta respuesta fue modificada hace 5 años, 10 meses por [Héctor Prieto](https://es.wordpress.org/support/users/priethor/).

Viendo 1 respuesta (de un total de 1)

 El debate ‘Restriccion de productos por categoria y rol de usuario’ está cerrado
a nuevas respuestas.

## Etiquetas

 * [categoria](https://es.wordpress.org/support/topic-tag/categoria/)
 * [hooks](https://es.wordpress.org/support/topic-tag/hooks/)
 * [snippets](https://es.wordpress.org/support/topic-tag/snippets/)
 * [WooCommerce](https://es.wordpress.org/support/topic-tag/woocommerce/)

 * En: [WooCommerce](https://es.wordpress.org/support/forum/plugins-y-hacks/woocommerce/)
 * 1 respuesta
 * 2 participantes
 * Última respuesta de: [Héctor Prieto](https://es.wordpress.org/support/users/priethor/)
 * Última actividad: [hace 5 años, 10 meses](https://es.wordpress.org/support/topic/restriccion-de-productos-por-categoria-y-rol-de-usuario/#post-12192101)
 * Estado: sin resolver

## Debates

### Debates populares

### Debates sin respuestas

### Debates que no son soporte

### Debates resueltos

### Debates no resueltos

### Todos los debates
