• 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)
  • ¡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 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 4 años, 3 meses por Héctor Prieto. Razón: Añadidos más puntos suspensivos
    • Esta respuesta fue modificada hace 4 años, 3 meses por Héctor Prieto.
Viendo 1 respuesta (de un total de 1)
  • El debate ‘Restriccion de productos por categoria y rol de usuario’ está cerrado a nuevas respuestas.