Categorías con comas en WordPress (válido para etiquetas u otras taxonomías)

Cuando estamos creando una nueva entrada en el blog de WordPress, vemos que podemos asignarla a una o más categorías que ya existen o incluso crear nuevas categorías desde esa misma página de "entrada". El problema es, por defecto, para asignar la entrada a varias categorías, éstas se separan por comas... pero... ¿qué pasa si el nombre de la categoría incluye comas? que nos lo va a separar en 2 o más categorías y no es lo que queremos.
Aquí os explicamos cómo modificar el código de WordPress para que admita categorías cuyo nombre contenga comas.
Este tutorial es también válido para etiquetas o cualquier taxonomía personalizada (custom taxonomies).

En este ejemplo podemos vemos una taxonomía personalizada llamada Autores y vemos cómo se quieren introducir autores con el formato "apellido, nombre". De esta forma, nos encontamos con el problema de que, al introducir un nuevo autor desde la página de "Entrada", nos lo separaba en dos: uno para el apellido y otro para el nombre. Un desastre.

¿Cómo crear categorías con comas? ¿Cómo crear etiquetas con comas? ¿Cómo crear taxonomías con comas?


1.- Forma súper sencilla válida cuando las taxonomías van a ser fijas y sólo tenemos que crearlas al principio. Si los usuarios que utilicen la web no van a estar continuamente añadiendo términos dentro de la taxonomía, categoría o etiqueta, lo más sencillo es crear el término dentro de la sección de "Categorías, etiquetas o de la taxonomía correspondiente". De esta forma, el nombre sí que puede contener comas.



2.- La solución anterior muchas veces no es válida porque vamos a estar creando nuevos términos para las categorías o taxonomías continuamente o porque estamos desarrollando una web para unos clientes y queremos ponérselo fácil, ofrecerles una solución intuitiva en un único paso, sin tener que crear la categoría o taxonomía antes de querer asignarla.

Esta solución nos permitirá introducir categorías, etiquetas o custom taxonomies con comas desde la página de la Entrada (incluyendo tipos de entrada personalizados".

Deberemos editar el archivo functions.php de nuestra plantilla o, mejor aún, del tema hijo (o child theme) si es que lo tenemos. Añadiremos el siguiente código:

function callbackFunction() {
    $action = $_POST['action'];
    $taxonomy = get_taxonomy(substr($action, 4));
    check_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name );
    if ( !current_user_can( $taxonomy->cap->edit_terms ) )
        wp_die( -1 );
    $parent = isset($_POST['new'.$taxonomy->name.'_parent']) ? (int) $_POST['new'.$taxonomy->name.'_parent'] : 0;
    if ( 0 > $parent )
        $parent = 0;
        
    if ( $taxonomy->name == 'category' )
        $post_category = isset($_POST['post_category']) ? (array) $_POST['post_category'] : array();
    else
        $post_category = ( isset($_POST['tax_input']) && isset($_POST['tax_input'][$taxonomy->name]) ) ? (array) $_POST['tax_input'][$taxonomy->name] : array();
        
    $checked_categories = array_map( 'absint', (array) $post_category );
    $popular_ids = wp_popular_terms_checklist($taxonomy->name, 0, 10, false);
    $cat_name = trim($_POST['new'.$taxonomy->name]);
    $category_nicename = sanitize_title($cat_name);
    if ($category_nicename !== '') {
        if (!$cat_id = term_exists( $cat_name, $taxonomy->name, $parent)) {
            $cat_id = wp_insert_term(
                $cat_name,
                $taxonomy->name,
                array('parent' => $parent)
            );
        }
            
            
        if (is_array($cat_id)) {
            $cat_id = $cat_id['term_id'];
        }
        
        $checked_categories[] = $cat_id;
        
        if (!$parent) {
            ob_start();
    
            wp_terms_checklist( 0, array(
                'taxonomy' => $taxonomy->name,
                'descendants_and_self' => $cat_id,
                'selected_cats' => $checked_categories,
                'popular_cats' => $popular_ids )
            );
    
            $data = ob_get_clean();
    
            $add = array(
                'what' => $taxonomy->name,
                'id' => $cat_id,
                'data' => str_replace( array("\n", "\t"), '', $data),
                'position' => -1
            );
        }
        
    }
    if ( $parent ) { // Foncy - replace the parent and all its children
        $parent = get_term( $parent, $taxonomy->name );
        $term_id = $parent->term_id;
        while ( $parent->parent ) { // get the top parent
            $parent = get_term( $parent->parent, $taxonomy->name );
            if ( is_wp_error( $parent ) )
                break;
            $term_id = $parent->term_id;
        }
        ob_start();
        wp_terms_checklist( 0, array(
            'taxonomy' => $taxonomy->name,
            'descendants_and_self' => $term_id,
            'selected_cats' => $checked_categories,
            'popular_cats' => $popular_ids)
        );
        $data = ob_get_clean();
        $add = array(
            'what' => $taxonomy->name,
            'id' => $term_id,
            'data' => str_replace( array("\n", "\t"), '', $data),
            'position' => -1
        );
    }
    ob_start();
    wp_dropdown_categories( array(
        'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name',
        'hierarchical' => 1, 'show_option_none' => '— '.$taxonomy->labels->parent_item.' —'
    ) );
    $sup = ob_get_clean();
    $add['supplemental'] = array( 'newcat_parent' => $sup );
    $x = new \WP_Ajax_Response( $add );
    $x->send();
}

//Eliminaremos el filtro AJAX
remove_filter('wp_ajax_add-category' , '_wp_ajax_add_hierarchical_term');
//Crearemos el nuevo filtro
add_filter('wp_ajax_add-category', 'callbackFunction');


Las 2 últimas líneas (en las que borramos el filtro y creamos el nuevo) valdrán si queremos meter categorías con comas. En cambio, si estamos tratando con taxonomías personalizadas, el nombre del filtro será wp_ajax_slug-de-la-taxonomía en vez de wp_ajax_add-category .


Siguiendo con el ejemplo que estábamos viendo, cambiaríamos el nombre del filtro en las 2 últimas líneas, ya que el slug de nuestra taxonomía es "autores":

remove_filter('wp_ajax_add-autores' , '_wp_ajax_add_hierarchical_term');
add_filter('wp_ajax_add-autores', 'callbackFunction');

 ¡¡¡Importante!!! Este código sólo funciona para taxonomías con herencia (es decir que pueden tener padres e hijos)

Hemos obtenido las instrucciones de un blog en inglés, lo hemos probado y nos ha funcionado perfectamente. No obstante, aquí os dejamos el enlace al blog:

https://www.duyngha.com/add-category-comma-wordpress/