¿Cómo agregar un elemento predeterminado a una taxonomía personalizada?
La taxonomía predeterminada de WordPress (Categorías) tiene el elemento Sin categoría por defecto. ¿Cómo agregar un elemento predeterminado a una nueva taxonomía personalizada?
functions.php:
// === TAXONOMÍAS PERSONALIZADAS === //
function my_custom_taxonomies() {
register_taxonomy(
'block', // nombre interno = nombre de taxonomía legible por máquina
'static_content', // tipo de objeto = post, page, link, o custom post-type
array(
'hierarchical' => true,
'labels' => array(
'name' => __( 'Bloques' ),
'singular_name' => __( 'Bloque' ),
'add_new_item' => 'Agregar Nuevo Bloque',
'edit_item' => 'Editar Bloque',
'new_item' => 'Nuevo Bloque',
'search_items' => 'Buscar Bloque',
'not_found' => 'No se encontró ningún Bloque',
'not_found_in_trash' => 'No se encontró ningún Bloque en la papelera',
),
'query_var' => true, // habilitar consultas específicas de taxonomía
'rewrite' => array( 'slug' => 'block' ), // ¿permalinks amigables para tu taxonomía?
)
);
}
add_action('init', 'my_custom_taxonomies', 0);
EDICIÓN: Solo quiero tener el elemento de taxonomía allí cuando se instala el tema. No tiene que agregarse automáticamente a ningún término vacío.

Actualización a partir de 2020
Versión | Descripción |
---|---|
5.5.0 |
Introdujo el argumento default_term . |
Desde el lanzamiento de WordPress versión 5.5.0, ahora puedes especificar un término predeterminado al registrar una nueva taxonomía personalizada utilizando el muy útil argumento default_term
.
$args = [
/...
'default_term' => [ //(string|array) Término predeterminado para usar en la taxonomía.
'name' => 'Patata', //(string) Nombre del término predeterminado.
'slug' => 'patata', //(string) Slug para el término predeterminado.
'description' => 'Puedes pasar la noche dentro de una patata, https://www.youtube.com/watch?v=h2mj-7-Zklw', //(string) Descripción del término predeterminado.
],
/...
];

Echa un vistazo aquí:
Básicamente lo que necesitas hacer es usar el hook save_post para verificar los términos del post y agregar el término predeterminado de tu taxonomía si está vacío.
Si solo quieres tener un término inicial establecido en tu taxonomía personalizada, entonces puedes usar wp_insert_term()
. Probablemente lo más fácil es agregarlo en la misma función que estás usando para crear tu taxonomía personalizada. Como menciona t3ios en los comentarios, deberías llamar primero a get_term()
, y solo insertar el término si el valor de retorno es null (es decir, el término no existe).
Este código de ejemplo es del Codex: http://codex.wordpress.org/Function_Reference/wp_insert_term
$parent_term = term_exists( 'fruits', 'product' ); // se retorna un array si se da la taxonomía
$parent_term_id = $parent_term['term_id']; // obtener el ID numérico del término
wp_insert_term(
'Apple', // el término
'product', // la taxonomía
array(
'description'=> 'Una deliciosa manzana.',
'slug' => 'apple',
'parent'=> $parent_term_id
)
);

@anu Creo que no me expliqué muy bien, solo quería tener esa taxonomía ahí cuando se instale el tema. No es necesario que tenga ningún término si está vacía.

@anu Excelente, desearía poder votar tu respuesta más veces. Edité las preguntas. ¿Dónde exactamente debería colocar ese código que escribiste arriba?

El código que agregué es solo un ejemplo (y proviene del codex de WordPress) - por lo que necesitarás modificarlo según sea necesario. El mejor lugar para agregarlo sería justo antes de la llave de cierre de la función.

Y si funciona, simplemente acepta la respuesta marcándola como correcta. ¡Eso es mejor que votos adicionales ;)

¿Estás seguro de que deseas ejecutar la inserción en esa función? Se ejecuta en init, es decir, en cada página. No creo que quieras ejecutar la inserción cada vez que se carga una página, ¿verdad? Tal vez la función de inserción devuelva null/false si ya existe un término con ese nombre (no lo he verificado), pero de todos modos parece un poco innecesario (¿por qué no llamar a get_term(s) para ver si existe y luego insertar si no?).

La categoría por defecto está codificada de forma rígida en la función wp_insert_post()
.
Por lo tanto, no se puede replicar exactamente, pero puedes manejarlo de otras formas. Yo intentaría engancharme al cambio de estado del post para nuevas entradas y asignar el término por defecto deseado si no se asignó ninguno durante la creación del post.

Necesitaba poblar una Taxonomía Personalizada "Días" con los días de la semana... No quería que el cliente tuviera que crear los días, eliminarlos o escribirlos incorrectamente. Siguiendo los consejos anteriores, llegué a esto, pero me pregunto si hay una forma más concisa de codificarlo:
/*************************************** ...Crear una Taxonomía Personalizada para días ******************************/
add_action( 'init', 'build_taxonomies', 0 );
function build_taxonomies() {
register_taxonomy(
'days',
'schedule',
array( 'hierarchical' => true,
'label' => 'Días',
'query_var' => true,
'show_ui' => false, //elimina los menús del panel de administración
'rewrite' => true ) );
/*---------------------------------------Verificar si los días están creados... si no, crearlos----*/
$parent_term = term_exists( 'days', 'days' ); // se devuelve un array si se proporciona la taxonomía
$parent_term_id = $parent_term['term_id']; // obtener el ID numérico del término
wp_insert_term(//probablemente debería ser un array, pero seguía obteniendo errores..
'Lunes', // el término
'days', // la taxonomía
array(
'slug' => 'lunes',
'parent'=> $parent_term_id ));
wp_insert_term(
'Martes', // el término
'days', // la taxonomía
array(
'slug' => 'martes',
'parent'=> $parent_term_id ));
wp_insert_term(
'Miércoles', // el término
'days', // la taxonomía
array(
'slug' => 'miercoles',
'parent'=> $parent_term_id ));
wp_insert_term(
'Jueves', // el término
'days', // la taxonomía
array(
'slug' => 'jueves',
'parent'=> $parent_term_id ));
wp_insert_term(
'Viernes', // el término
'days', // la taxonomía
array(
'slug' => 'viernes',
'parent'=> $parent_term_id ));
wp_insert_term(
'Sábado', // el término
'days', // la taxonomía
array(
'slug' => 'sabado',
'parent'=> $parent_term_id ));
wp_insert_term(
'Domingo', // el término
'days', // la taxonomía
array(
'slug' => 'domingo',
'parent'=> $parent_term_id ));
}
/************ ahora agrego mi propio meta box para días para eliminar controles adicionales *************/
add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
add_meta_box('myrelateddiv', 'Días*', 'ilc_post_related_meta_box', 'schedule', 'normal', 'low', array( 'taxonomy' => 'days' ));
}
function ilc_post_related_meta_box( $post, $box ) {
$defaults = array('taxonomy' => 'related');
if ( !isset($box['args']) || !is_array($box['args']) )
$args = array();
else
$args = $box['args'];
extract( wp_parse_args($args, $defaults), EXTR_SKIP );
$tax = get_taxonomy($taxonomy);
?>
<ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
<?php
wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids, 'checked_ontop' => FALSE ) )
?>
</ul>

Usando el plugin Default Term puedes hacer esto
register_taxonomy( 'custom-tax', array('post'), array(
'label' => 'Etiqueta Personalizada',
'public' => true,
'show_ui' => true,
'default_term' => 'Término por Defecto', // Añade esta línea a tu código
// luego activa y desactiva el plugin de término por defecto para guardar los términos que configuraste.
));
Por defecto, cuando se envía el post, guardará el término por defecto en el post si no hay ningún término seleccionado. Funciona tanto para taxonomías jerárquicas como no jerárquicas.
