Diagrama de una ontología con conceptos y relaciones entre ellos

Ya vimos que no importa lo bien diseñada que sea la estructura de categorías y etiquetas de una nueva web, está más que demostrado que toda taxonomía de categorías y etiquetas degenera con el tiempo y que habrá que hacer «limpieza» regularmente.

Los plugins que comentamos en la entrada de «Cómo fusionar y reorganizar categorías y etiquetas» funcionan a la perfección en la mayoría de casos pero aun así todos tienen una limitación importante: las entradas asignadas a una subcategoría que se convierte en etiqueta no se reasignan a la categoría padre durante la conversión.

¿Confundido acerca de la importancia de lo que acabo de decir? Déjame que te lo explique con un ejemplo. En una de mis webs, tenía la siguiente estructura de términos:

Category 'programming' has Python, Ruby and Java as subcategories
La categoría ‘programming’ tiene Python, Ruby y Java como subcategorías

Como pocas entradas son específicas a un lenguaje de programación concreto, quise convertir los lenguajes en etiquetas y conservar sólo programming como categoría para simplificar la organización del contenido. Si intento hacerlo con uno de los plugins existentes conseguiré transformar Java, Pyhton y Ruby en tags y utilizarlos para etiquetar las entradas correspondientes pero TODAS esas entradas desaparecerán de la categoría «programming». ¡Y esto no es ni por asomo lo que quiero! Siguen siendo entradas que hablan de programación y quiero que mis visitantes las encuentren cuando naveguen mi web usando esa categoría como filtro.

Para arreglarlo he cambiado ligeramente el archivo wpcat2tag-importer.php (el archivo que contiene todo el código de la herramienta de conversión por defecto de WordPress) para añadir las siguientes líneas de código en la función function convert_categories()

//Force the posts linked to the converted category to be linked as well to their parent category
if ($category->parent)
{
    $term_order = 0;
    echo __('Linking posts with parent category.', 'wpcat2tag-importer') . "n";
    $objects_ids = get_objects_in_term($category->term_id, 'category');
    $parent_category=& get_category($category->parent);
    $parent_taxonomy_id=$parent_category->term_taxonomy_id;
    foreach ( $objects_ids as $object_id ) {
        $exists=$wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d AND object_id=%d",$parent_taxonomy_id, $object_id));
        if($exists==0)
        {
            $wpdb->insert($wpdb->term_relationships, array('object_id'=>$object_id, 'term_taxonomy_id'=>$parent_taxonomy_id,'term_order'=>$term_order),array('%d','%d','%d'));
            $count =$wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d",$parent_taxonomy_id));
            $wpdb->update($wpdb->term_taxonomy, array('count' => $count), array('term_id' => $category->parent, 'taxonomy' => 'category'));
        }
    }
}

En pocas palabras, el nuevo trozo de código recupera las entradas asociadas a la categoría que se va a convertir en etiqueta, comprueba si esas entradas están también ligadas a la categoría padre y, sino lo están, las añade.

Programming category after the conversion, linking to all posts of its former subcategories
La categoría «Programming» después de la conversión, asociada a todos las entradas de las antiguas subcategorías

Bonus: mi queja

Si estáis de acuerdo conmigo en que mi modificación es una mejora al plugin por defecto, la pregunta que sigue es: ¿Qué hago con ella?. Lo más fácil sería crear un nuevo plugin que clone el original, pero (1) no creo que esta pequeña contribución sea suficiente para justificar un nuevo plugin y (2) los usuarios actuales ni se enterarían.

Lo que realmente me gustaría sería poder enviar la nueva versión a los autores de la herramienta de conversión original para que lo revisen y, si lo ven correcto, lo incluyan en la siguiente versión. El problema es que no parece que haya una manera fácil de hacer esto. Si bien este plugin es usado masivamente (no es parte del core de WordPress, pero casi), no hay ningún repositorio público con el que interactuar y la discusión en el foro de WordPress.org hace mucho que está decaída. Por desgracia, parece ser que si bien WordPress es un proyecto tan abierto a la comunidad, todavía hay bastantes cosas a mejorar.

Así que, por el momento, si queréis disfrutar de esta funcionalidad, os tocará hacer un copia-y-pega a mano 🙁

Deja una respuesta

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

He leído y acepto la política de privacidad de Nelio Software

Tus datos personales se almacenarán en SiteGround y serán usados por Nelio Software con el único objetivo de publicar tu comentario aquí. Con el envío de este comentario, nos das el consentimiento expreso para ello. Escríbenos para acceder, rectificar, limitar o eliminar tus datos personales.