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

16

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);

Es obviamente jerárquico. El nivel superior contiene tipos de versión, por ejemplo, DVD, blu-ray. El nivel bajo que son las 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 6 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 existe:

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 a pesar de que los términos se ingresan en la base de datos, no aparecen en la página de taxonomía. A lo sumo, los términos de nivel superior aparecen. 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 desactivé y reactivé 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 "Padres" en el que 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, ENTONCES aparecen los términos secundarios.

    
pregunta Manny Fleurmond 02.02.2011 - 13:52

6 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 directamente a delete_option("{$taxonomy}_children"); .

Ver la función _get_term_hierarchy ().

    
respondido por el scribu 09.02.2011 - 00:55
6

Mis 2 centavos: estoy creando una extensión para el complemento WooCommerce que permite la gestión de categorías / productos 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 en caché fue llamar a delete_option("product_cat_children"); después del bucle que crea las categorías y subcategorías. Espero que esto ayude a alguien más!

    
respondido por el BWDesign 28.11.2012 - 20:28
2

Es posible que esté recibiendo un objeto desde term_exists($term, $taxonomy, $parent) si la taxonomía se establece cuando se le llama. Está establecido en el código de muestra que publicaste, así que supongo que ese es el problema.

Sus declaraciones de inserciones esperan una matriz cuando hacen referencia a claves ...

Por ejemplo.

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

..pero es posible que realmente recuperes un objeto de 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 tengo razón y ese es el problema, debería solucionarlo, aunque no lo llamaría una solución elegante.

Esperamos que esa sea la respuesta / ayuda que buscabas ... :)

    
respondido por el t31os 02.02.2011 - 14:43
1

Gracias. Esta pregunta ayudó mucho. Estaba luchando con las pruebas de unidad 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 hacerlo nuevamente después de agregar las categorías de segundo nivel para permitir que wordpress borre todo y deje pasar las pruebas de unidad. Esto evita la necesidad de una "segunda página de carga / actualización adicional" a la que se hace referencia en otra respuesta aquí.

    
respondido por el Steve 25.02.2013 - 02:06
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();
    
respondido por el T.Todua 26.11.2013 - 18:13
0

Solo una actualización final: esto se solucionó en su totalidad en WP 3.9: enlace

    
respondido por el Manny Fleurmond 22.12.2017 - 05:14

Lea otras preguntas en las etiquetas