¿Cómo agregar un elemento predeterminado a una taxonomía personalizada?

18 ene 2011, 13:14:41
Vistas: 27.6K
Votos: 12

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.

0
Todas las respuestas a la pregunta 5
2
14

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.
    ],
    /...
];
7 mar 2021 20:52:49
Comentarios

¿Alguna idea de cómo agregar múltiples términos por defecto?

Loosie94 Loosie94
18 oct 2022 22:12:28

Acepta un array, entonces... array( array( 'name' => 'Potato', 'slug' => 'potato', 'description' => '', ), array( 'name' => 'Chicken', 'slug' => 'chicken', 'description' => '', ), ) ...

amarinediary amarinediary
18 oct 2022 22:20:39
7

Echa un vistazo aquí:

https://web.archive.org/web/20150403012347/http://wordpress.mfields.org/2010/set-default-terms-for-your-custom-taxonomies-in-wordpress-3-0/

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
  )
);
18 ene 2011 13:46:07
Comentarios

@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.

wyc wyc
18 ene 2011 14:00:53

@janoChen - Actualicé la respuesta

anu anu
18 ene 2011 14:09:47

@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?

wyc wyc
18 ene 2011 14:13:19

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.

anu anu
18 ene 2011 14:15:29

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

anu anu
18 ene 2011 14:16:54

¿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?).

t31os t31os
18 ene 2011 18:30:29

sí, totalmente de acuerdo en que deberías verificar si el término existe antes de hacer una inserción - eso era solo un código de ejemplo del Codex. Actualizaré la respuesta

anu anu
18 ene 2011 19:56:20
Mostrar los 2 comentarios restantes
1

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.

18 ene 2011 13:41:28
Comentarios

+1 por enlazar al hook del estado de la publicación, eso es exactamente lo que estaba buscando.

Matt Matt
25 feb 2016 15:28:23
0

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>   
11 oct 2011 20:57:07
1

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.

7 ago 2016 07:38:37
Comentarios

Sería bueno que seleccionara automáticamente el término especificado en la vista de creación de la entrada, para que el usuario sea consciente de lo que sucederá.

Garconis Garconis
12 sept 2017 20:11:04