Obtener las categorías de un producto en WooCommerce de más a menos específicas

Justo hoy he resuelto un problema de un cliente que tiene que aplicar los nuevos canon digital, vigentes desde el 1 de julio, a todos sus productos. Se trata de una tienda con WooCommerce y tiene multitud de referencia de productos digitales, con canon digital, pero que varían en base a la categoría (no es lo mismo el canon de un smarthpone que de una memoria USB por ejemplo).

Como el canon es algo que va relacionado con la categoría, se guarda el importe del canon digital, que es unitario por cada producto, en un meta dato de la categoría de producto. Luego usando la API de fees, que no sé si la conocéis pero es aplicar comisiones y recargos ajenos a los productos en el carrito y en finalizar compra; se aplica la totalidad del canon de cada línea del carrito.

Pero me ha surgido un problema, los productos, en ocasiones aparecen en varias categorías y claro, es posible que se diera el caso que un mismo producto tuviera diferentes cánones en diferentes categorías. ¿Qué haríamos en este caso? Pues elegir la categoría más específica. ¿Cuál es la más específica? Pues la subcategoría de mayor nivel. De forma que si tenemos el siguiente árbol de categorías:

  • Smartphones -> Xiaomi -> Serie Redmi

Buscaríamos el canon específico primero en Serie Redmi, luego en Xiaomi y luego en Smartphones. La primera categoría que tuviera un canon aplicado, sería la que se usaría.

¿Y cómo sé en WooCommerce dado un identificador de producto cuáles son sus categoría ordenadas de más específicas a menos específicas? Pues con esta función.

function obtener_categorias_producto_ordenadas_por_profundidad( $product_id ){
        $terms = get_the_terms( $product_id, 'product_cat' );

        if( empty( $terms ) )
            return array();
        
        $depths = array();

        foreach ($terms as $term) {
            $depths[$term->term_id] = count( get_ancestors( $term->term_id, 'product_cat' ) );
        }

        arsort( $depths );

        $categories = array();
        foreach ($depths as $term_id => $depth) {
            $categories[] = $term_id;
        }

        return $categories;
    }

Y bueno os explico de palabra cómo funciona:

  1. Primero se obtienen las categorías del producto, si no tiene categorías, se devuelve un array vacío
  2. Se crea un array de profundidades (de forma que si una categoría es padre, la profundidad es 0, si fuera una subcategoría de primer nivel sería 1, si fuera una subcategoría hija de una subcategoría, sería 2 y así sucesivamente), para ello, se recorren las categorías y se obtienes cuántos ancestros tienen la categoría
  3. Se ordena la lista de profundidades por el valor, que eso es lo que hace la función arsort de PHP
  4. Se prepara el resultado, guardando en un array los ID de categoría en orden de profundidad y se devuelven

Seguro que os sirve en algún desarrollo que tengáis que realizar.

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)
Cargando…

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

0

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Carrito