El shortcode ahora es más robusto, limpio y fácil de mantener. Puedes usarlo igual que antes pero ahora solo 254 líneas pero más legibles.
3 funciones separadas con responsabilidades únicas:
ymk_arbol_taxonomias_shortcode()– lógica principalymk_build_term_link()– construcción de URLs (reutilizable)ymk_get_taxonomy_icon()– manejo de iconos (reutilizable)
Recursiva con profundidad dinámica la magia está en que la función se llama a sí misma con el $term_id como nuevo padre y $current_level + 1 como nuevo nivel. ¡Así construye el árbol infinitamente!
get_categories()(línea 159): Obtiene los términos del nivel actualget_terms()(línea 183): Verifica si un término tiene hijosymk_build_taxonomy_tree(): Se llama a sí misma recursivamente para construir cada nivel
📝 Ejemplos de uso:
Clases por defecto (estilo menú WordPress):
[arbol-taxonomias taxonomy='product_cat' icon='true']
Genera:
<ul class="sub-menu alignwide arbol-taxonomias">
<li class="menu-item menu-item-has-children">...</li>
</ul>
Clases personalizadas:
[arbol-taxonomias taxonomy='product_cat' icon='true' class='mi-lista' itemclass='mi-item']
Genera:
<ul class="mi-lista alignwide arbol-taxonomias">
<li class="mi-item menu-item-has-children">...</li>
</ul>
Parámetros disponibles:
taxonomy:'product_cat'(o cualquier taxonomía)icon:'true'o'false'– Muestra iconos si existen en taxonomy_image_pluginempty:'true'o'false'– Mostrar/ocultar términos sin productosdeep:0,1,2, o3por defecto y-1para infinito.orderby:'name','count','id'– Orden de las categoríasparent:0(raíz) o ID de categoría padre específicaurl: URL base personalizada (ej:'/tienda')class: clase css para parent ulitemclass: clase css para items
⚠️ Importante para que funcionen los iconos:
El shortcode busca las imágenes en taxonomy_image_plugin (el plugin que ya tienes instalado). Asegúrate de que:
- Las categorías tienen imágenes asignadas desde el plugin de imágenes de taxonomía
- El parámetro
icon='true'está presente en el shortcode
Los iconos se renderizan con CSS mask, igual que en la versión de ortogest, así que heredarán el color del texto (currentColor).
Conclusión:
Mi versión es mejor porque:
- ✅ Más rápida (menos llamadas a BD)
- ✅ Más segura (escapado correcto)
- ✅ Más mantenible (código DRY – Don’t Repeat Yourself)
- ✅ Más legible (funciones pequeñas con un propósito)
- ✅ Más robusta (validaciones y early returns)
- ✅ Mejor documentada (PHPDoc completo)
$menu_output .= '<li class="' . esc_attr( $item_class ) . '">'; // Escapado correcto