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

10

La taxonomía predeterminada de Wordpress (Categorías) tiene el elemento Sin clasificar por defecto. ¿Cómo agregar un elemento predeterminado a una nueva taxonomía personalizada?

funciones.php:

// === CUSTOM TAXONOMIES === //
function my_custom_taxonomies() {
    register_taxonomy(
        'block',        // internal name = machine-readable taxonomy name
        'static_content',       // object type = post, page, link, or custom post-type
        array(
            'hierarchical' => true,
            'labels' => array(
                'name' => __( 'Blocks' ),
                'singular_name' => __( 'Block' ),
                'add_new_item' => 'Add New Block',
                'edit_item' => 'Edit Block',
                'new_item' => 'New Block',
                'search_items' => 'Search Block',
                'not_found' => 'No Block found',
                'not_found_in_trash' => 'No Block found in trash',
            ),
            'query_var' => true,    // enable taxonomy-specific querying
            'rewrite' => array( 'slug' => 'block' ),    // pretty permalinks for your taxonomy?
        )
    );
}
add_action('init', 'my_custom_taxonomies', 0);

EDITAR: 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 .

janoChen
fuente

Respuestas:

8

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 debe hacer es usar el gancho save_post para verificar los términos de la publicación y agregar el término predeterminado de su taxonomía si está vacío.

Si solo desea tener un término inicial establecido en su taxonomía personalizada, puede usarlo wp_insert_term(). Probablemente sea más fácil agregarlo en la misma función que está utilizando para crear su taxonomía personalizada. A medida que t3ios agrega en los comentarios, debe llamar get_term()primero y solo insertar el término si el valor de retorno es nulo (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' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
wp_insert_term(
  'Apple', // the term 
  'product', // the taxonomy
  array(
    'description'=> 'A yummy apple.', 
    'slug' => 'apple', 
    'parent'=> $parent_term_id
  )
);
anu
fuente
@anu Creo que no me expliqué muy bien, solo quería tener esa taxonomía allí cuando se instala el tema. No tiene ningún término si está vacío.
janoChen
@janoChen - Actualicé la respuesta
anu
@anu Excelente, desearía poder votar más tu respuesta. Edité las preguntas. ¿Dónde exactamente debo colocar ese código que escribió arriba?
janoChen
El código que agregué es solo un ejemplo (y es del códice de WordPress), por lo que deberá modificarlo según sea necesario. El mejor lugar para agregarlo sería justo antes de la llave de cierre para la función.
anu
1
Seguro que desea ejecutar la inserción en esa función, se ejecuta en init, es decir. cada página, no creo que quiera ejecutar la inserción cada vez que se llama una página, ¿verdad? Tal vez la función de inserción devuelve nulo / falso si ya existe un término coincidente con ese nombre (no he buscado), pero de todos modos eso parece un poco innecesario (¿por qué no llamar a get_term (s) y ver si existe)? insertar si no).
t31os
4

La categoría predeterminada es el caso codificado en la wp_insert_post()función.

Por lo tanto, no se puede replicar exactamente, pero puede manejarlo de otras maneras. Intentaría conectarme a la transición del estado de la publicación para nuevas publicaciones y asignar el término predeterminado deseado si no se asignó ninguno durante la creación de la publicación.

Rarst
fuente
+1 para vincular al enlace de estado de la publicación, eso es exactamente lo que estaba buscando.
Matt
0

Usando el complemento de Término predeterminado puede hacer esto

register_taxonomy( 'custom-tax', array('post'), array(
    'label'              => 'Custom Tag',
    'public'             => true,
    'show_ui'            => true,
    'default_term'       => 'Some Default Term', // Add this line to your code 
// then activate and deactivate the default term plugin to save the terms you set.
));

De manera predeterminada, cuando se envía la publicación, guardará el término predeterminado en la publicación si no hay ningún término marcado. Funciona tanto para taxonomías jerárquicas como no jerárquicas.

Allan Christian Carlos
fuente
Sería bueno si seleccionara automáticamente el término especificado en la vista posterior a la creación, de modo que el usuario sepa lo que sucederá.
Garconis
0

Necesitaba completar una "Taxonomía personalizada" Días "con los días de la semana ... No quería que el cliente tuviera que meterse con la creación de días, o entrar allí y eliminar días o errores ortográficos. Siguiendo el consejo anterior, se me ocurrió esto, pero me pregunto si hay una forma más concisa de codificarlo:

 /*************************************** ...Create a Custom Taxonomy for days ******************************/
add_action( 'init', 'build_taxonomies', 0 );  
function build_taxonomies() {  
    register_taxonomy( 
    'days', 
    'schedule',
   array( 'hierarchical' => true, 
    'label' => 'Days',
    'query_var' => true, 
    'show_ui' => false, //removes the menus from admin menu and edit panel  
    'rewrite' => true ) );  

/*---------------------------------------Check to see if the days are created..if not, create them----*/
$parent_term = term_exists( 'days', 'days' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id

wp_insert_term(//this should probably be an array, but I kept getting errors..
        'Monday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'monday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Tuesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'tuesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Wednesday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'wednesday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Thursday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'thursday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Friday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'friday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Saturday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'saturday',
        'parent'=> $parent_term_id ));

wp_insert_term(
        'Sunday', // the term 
        'days', // the taxonomy
        array(
        'slug' => 'sunday',
        'parent'=> $parent_term_id ));
}
/************ now I add my own meta box for days to get rid of extra controls *************/

add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
 add_meta_box('myrelateddiv', 'Days*', '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>   
endle.winters
fuente