Come aggiungere un elemento predefinito a una tassonomia personalizzata?
La tassonomia predefinita di WordPress (Categorie) ha l'elemento "Senza categoria" come predefinito. Come aggiungere un elemento predefinito a una nuova tassonomia personalizzata?
functions.php:
// === TASSONOMIE PERSONALIZZATE === //
function my_custom_taxonomies() {
register_taxonomy(
'block', // nome interno = nome tassonomia leggibile dalla macchina
'static_content', // tipo di oggetto = post, page, link, o custom post-type
array(
'hierarchical' => true,
'labels' => array(
'name' => __( 'Blocchi' ),
'singular_name' => __( 'Blocco' ),
'add_new_item' => 'Aggiungi Nuovo Blocco',
'edit_item' => 'Modifica Blocco',
'new_item' => 'Nuovo Blocco',
'search_items' => 'Cerca Blocco',
'not_found' => 'Nessun Blocco trovato',
'not_found_in_trash' => 'Nessun Blocco trovato nel cestino',
),
'query_var' => true, // abilita query specifiche per la tassonomia
'rewrite' => array( 'slug' => 'block' ), // permalink descrittivi per la tua tassonomia?
)
);
}
add_action('init', 'my_custom_taxonomies', 0);
MODIFICA: Voglio solo che l'elemento della tassonomia sia presente quando il tema viene installato. Non deve essere automaticamente aggiunto a nessun termine vuoto.

Aggiornamento al 2020
Versione | Descrizione |
---|---|
5.5.0 |
Introdotto l'argomento default_term . |
A partire dalla versione 5.5.0 di Wordpress, è possibile specificare un termine predefinito quando si registra una nuova tassonomia personalizzata utilizzando il comodo argomento default_term
.
$args = [
/...
'default_term' => [ //(string|array) Termine predefinito da utilizzare per la tassonomia.
'name' => 'Patata', //(string) Nome del termine predefinito.
'slug' => 'patata', //(string) Slug per il termine predefinito.
'description' => 'Puoi passare la notte dentro una patata, https://www.youtube.com/watch?v=h2mj-7-Zklw', //(string) Descrizione del termine predefinito.
],
/...
];

Dai un'occhiata qui:
In sostanza, quello che devi fare è utilizzare l'hook save_post per verificare i termini del post e aggiungere il termine predefinito dalla tua tassonomia se è vuoto.
Se vuoi semplicemente impostare un termine iniziale nella tua tassonomia personalizzata, puoi usare wp_insert_term()
. Probabilmente è più semplice aggiungerlo nella stessa funzione che stai utilizzando per creare la tua tassonomia personalizzata. Come aggiunge t3ios nei commenti, dovresti prima chiamare get_term()
e inserire il termine solo se il valore restituito è null (cioè il termine non esiste).
Questo codice di esempio è tratto dal Codex: http://codex.wordpress.org/Function_Reference/wp_insert_term
$parent_term = term_exists( 'fruits', 'product' ); // viene restituito un array se viene fornita la tassonomia
$parent_term_id = $parent_term['term_id']; // ottieni l'ID numerico del termine
wp_insert_term(
'Apple', // il termine
'product', // la tassonomia
array(
'description'=> 'Una mela deliziosa.',
'slug' => 'apple',
'parent'=> $parent_term_id
)
);

@anu Penso di non essermi spiegato molto bene, volevo semplicemente che quella tassonomia fosse presente quando il tema viene installato. Non deve necessariamente avere alcun termine se è vuota.

@anu Eccellente, vorrei poter votare la tua risposta più volte. Ho modificato le domande. Dove esattamente dovrei inserire quel codice che hai scritto sopra?

Il codice che ho aggiunto è solo un esempio (ed è tratto dal codex di WordPress) - dovrai modificarlo secondo necessità. Il posto migliore per inserirlo sarebbe appena prima della parentesi graffa di chiusura della funzione.

E se funziona, accetta semplicemente la risposta selezionandola! È meglio che voti aggiuntivi ;)

Sei sicuro di voler eseguire l'inserimento in quella funzione? Viene eseguito su init, cioè su ogni pagina, non credo tu voglia eseguire l'inserimento ogni volta che una pagina viene chiamata, vero? Forse la funzione di inserimento restituisce null/false se esiste già un termine con lo stesso nome (non ho verificato), ma comunque sembra un po' inutile (perché non chiamare get_term(s) per verificare se esiste e poi inserire solo se non presente).

La categoria predefinita è un caso hardcoded nella funzione wp_insert_post()
.
Quindi non può essere replicata esattamente, ma puoi gestirla in altri modi. Proverei ad agganciarmi alla transizione dello stato del post per i nuovi articoli e assegnare il termine predefinito desiderato se nessuno è stato assegnato durante la creazione del post.

Dovevo popolare una Tassonomia Personalizzata "Giorni" con i giorni della settimana. Non volevo che il cliente dovesse preoccuparsi di creare i giorni, o cancellarli o sbagliarne l'ortografia. Seguendo i consigli sopra ho creato questo codice, ma mi chiedo se esista un modo più conciso per scriverlo:
/*************************************** ...Crea una Tassonomia Personalizzata per i giorni ******************************/
add_action( 'init', 'build_taxonomies', 0 );
function build_taxonomies() {
register_taxonomy(
'days',
'schedule',
array( 'hierarchical' => true,
'label' => 'Giorni',
'query_var' => true,
'show_ui' => false, //rimuove i menu dal pannello admin e dall'editor
'rewrite' => true ) );
/*---------------------------------------Controlla se i giorni sono già creati.. altrimenti, creali----*/
$parent_term = term_exists( 'days', 'days' ); // restituisce un array se la tassonomia esiste
$parent_term_id = $parent_term['term_id']; // ottieni l'ID numerico del termine
wp_insert_term(//probabilmente dovrebbe essere un array, ma continuavo a ricevere errori..
'Lunedì', // il termine
'days', // la tassonomia
array(
'slug' => 'lunedi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Martedì', // il termine
'days', // la tassonomia
array(
'slug' => 'martedi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Mercoledì', // il termine
'days', // la tassonomia
array(
'slug' => 'mercoledi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Giovedì', // il termine
'days', // la tassonomia
array(
'slug' => 'giovedi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Venerdì', // il termine
'days', // la tassonomia
array(
'slug' => 'venerdi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Sabato', // il termine
'days', // la tassonomia
array(
'slug' => 'sabato',
'parent'=> $parent_term_id ));
wp_insert_term(
'Domenica', // il termine
'days', // la tassonomia
array(
'slug' => 'domenica',
'parent'=> $parent_term_id ));
}
/************ ora aggiungo la mia meta box personalizzata per i giorni per eliminare controlli extra *************/
add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
add_meta_box('myrelateddiv', 'Giorni*', '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>

Utilizzando il plugin Default Term puoi fare questo
register_taxonomy( 'custom-tax', array('post'), array(
'label' => 'Custom Tag',
'public' => true,
'show_ui' => true,
'default_term' => 'Some Default Term', // Aggiungi questa riga al tuo codice
// poi attiva e disattiva il plugin default term per salvare i termini che hai impostato.
));
Di default quando il post viene inviato salverà il termine predefinito al post se non è stato selezionato alcun termine. Funziona sia per tassonomie gerarchiche che non gerarchiche.
