Insertar términos en una taxonomía jerárquica


17

Realmente tengo algunos problemas con la inserción de términos. Aquí está mi escenario: tengo una taxonomía llamada veda_release_type:

//Release Type and Region
        $labels = array(
            'name'=> _x('Release Types/Regions', 'taxonomy general name' ),
            'singular_name' => _x('Release Type/Region', 'taxonomy singular name'),
            'search_items' => __('Search Release Types/Regions'),
            'popular_items' => __('Popular Release Types/Regions'),
            'all_items' => __('All Release Types/Regions'),
            'edit_item' => __('Edit Release Type/Regions'),
            'edit_item' => __('Edit Release Type/Region'),
            'update_item' => __('Update Release Type/Region'),
            'add_new_item' => __('Add New Release Type/Region'),
            'new_item_name' => __('New Release Type/Region Name'),
            'separate_items_with_commas' => __('Seperate Release Types/Regions with Commas'),
            'add_or_remove_items' => __('Add or Remove Release Types/Regions'),
            'choose_from_most_used' => __('Choose from Most Used Release Types/Regions')
        );
        $args = array( 
            'hierarchical' =>true,  
            'labels' => $labels,  
            'query_var' => true,  
            'rewrite' => array('slug' =>'release_type')     
        );
        register_taxonomy('veda_release_type', 'veda_release',$args);

Obviamente es jerárquico. El nivel superior contiene tipos de liberación, es decir, DVD, Blu-ray. El nivel debajo de eso son regiones, es decir. Región 1, Región 2, etc. Entonces, la Jerarquía que quiero es: DVD - Región 0 - Región 1 - Región 2 - Región 3 - Región 4 - Región 5 - Región 5 Blu-Ray - -Región A --Región B --Región C

Creé una función llamada insert_term en mi clase para verificar si existe un término y luego insertarlo si no es así:

public function insert_term ($term, $taxonomy, $args = array()) {
        if (isset($args['parent'])) {
            $parent = $args['parent'];
        } else {
            $parent = 0;
        }
        $result = term_exists($term, $taxonomy, $parent);
        if ($result == false || $result == 0) {
            return wp_insert_term($term, $taxonomy, $args);             
        } else {
            return (array) $result;
        }       
}

Y luego llamo a dicha función para insertar los términos:

    $dvd = $this->insert_term('DVD','veda_release_type');
    $this->insert_term('Region 0','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 1','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 2','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 3','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 4','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 5','veda_release_type',array('parent'=>$dvd['term_id']));
    $this->insert_term('Region 6','veda_release_type',array('parent'=>$dvd['term_id']));

    $bd = $this->insert_term('Blu-Ray', 'veda_release_type');
    $this->insert_term('Region A','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region B','veda_release_type',array('parent'=>$bd['term_id']));
    $this->insert_term('Region C','veda_release_type',array('parent'=>$bd['term_id']));

El problema que tengo es que, aunque los términos se incorporan a la base de datos, no aparecen en la página de taxonomía. A lo sumo, aparecen los términos de nivel superior. Tengo que probar varias cosas hasta que obligue a WordPress a reconocer los términos de subnivel. ¿Alguien se ha topado con esto o puede recomendar una mejor manera?

EDITAR: Noté algo más: intenté eliminar los términos de la base de datos y luego desactivar y volver a activar el complemento que declara los términos. Los dos términos principales se muestran en la página de términos, pero los términos secundarios no. Los términos secundarios se muestran en el menú desplegable "Principal" donde desea crear un nuevo término. Cuando agrego un término cuyo padre es uno de los términos secundarios y actualizo la página, LUEGO aparecen los términos secundarios. ingrese la descripción de la imagen aquí


Después de investigar un poco, parece que debe hacer algo con los términos caché. No estoy seguro de si o cómo puedo borrar el caché de manera consistente para actualizarlo.
Manny Fleurmond

Respuestas:


25

La jerarquía se almacena en caché y no se invalida correctamente. Este es un error, aún sin resolver a partir de WP 3.1.

Una solución alternativa sería llamar delete_option("{$taxonomy}_children");directamente.

Vea la función _get_term_hierarchy ().


Tenía la sensación de que era un problema de almacenamiento en caché. ¿Debo insertar esto antes o después de insertar a cada niño?
Manny Fleurmond

2
Hace una actualización adicional, pero colocar el código delete_option después de insertar todos los términos secundarios hace el truco. Gracias scribu. Valió la pena los puntos de repetición que renuncié. Esperemos que esto ayude a otros con problemas similares
Manny Fleurmond

¡Gracias! Acabo de pasar 4 horas en esto. Tan pronto como llegué a la idea de hacer una diferencia de la base de datos antes y después de agregar un término a través de la GUI de administrador, vi la opción y supe qué hacer con Google para venir aquí.
Según Wiklander el

6

Mis 2 centavos: estoy creando una extensión para el complemento WooCommerce que permite la gestión de categoría / producto del catálogo a través de un archivo CSV cargado. Me encontré con este mismo problema al generar las categorías. La solución para borrar las categorías de WooCommerce almacenadas en caché fue llamar delete_option("product_cat_children");después del ciclo que crea las categorías y subcategorías. ¡Espero que esto ayude a alguien más!


2

Posiblemente podría recibir un objeto term_exists($term, $taxonomy, $parent)si la taxonomía se establece cuando se llama. Está configurado en el código de muestra que publicaste, así que supongo que ese es el problema.

Sus declaraciones de inserción esperan una matriz cuando hacen referencia a claves.

P.ej.

$bd['term_id']
$dvd['term_id']

... pero en realidad puede estar recuperando un objeto term_exists.

Una forma rápida de determinar si ese es el problema sería actualizar esta línea.

return $result;

a..

return is_object( $result ) ? (array) $result : $result;

Si estoy en lo cierto y ese es el problema, eso debería solucionarlo, aunque no lo llamaría una solución elegante.

Esperemos que esa sea la respuesta / ayuda que estabas buscando ... :)


Lo siento por la respuesta tardía. Gracias por entender eso, pero no creo que eso haya resuelto el problema que tenía.
Manny Fleurmond

1

Gracias. Esta pregunta ayudó mucho. Estaba luchando con las pruebas unitarias y descubrí que tenía que hacer

delete_option('veda_release_type');
wp_cache_flush();

después de agregar mis categorías de nivel superior, y luego volver a hacerlo después de agregar las categorías de segundo nivel para permitir que wordpress borre todo y deje pasar las pruebas unitarias. Esto soluciona la necesidad de una "segunda carga de página / actualización adicional" a la que se hace referencia en otra respuesta aquí.


1

mi solución:

(tal vez fue necesario para limpiar los registros de caché ...)

$PARENT_CAT= wp_insert_term('Parent_category_NAME','category',  array('slug'=> 'Parent_category_NAME'));
delete_option("category_children");
wp_cache_flush();

    $child= wp_insert_term('children_category_NAME','category',array( 'slug'=>'children_category_NAME', 'parent' =>$PARENT_CAT['term_id']));
    delete_option("category_children");
    wp_cache_flush();

Por favor, explique su respuesta y solo publique el código.
s_ha_dum

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.