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.
fuente
Respuestas:
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 ().
fuente
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!fuente
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.
... 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.
a..
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 ... :)
fuente
Gracias. Esta pregunta ayudó mucho. Estaba luchando con las pruebas unitarias y descubrí que tenía que hacer
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í.
fuente
mi solución:
(tal vez fue necesario para limpiar los registros de caché ...)
fuente
Solo una actualización final: esto se solucionó todo el camino de regreso en WP 3.9: https://core.trac.wordpress.org/ticket/14485
fuente