Cum să adaugi un element implicit la o taxonomie personalizată?
Taxonomia implicită WordPress (Categorii) are elementul "Fără categorie" setat implicit. Cum putem adăuga un element implicit într-o taxonomie personalizată nouă?
functions.php:
// === TAXONOMII PERSONALIZATE === //
function my_custom_taxonomies() {
register_taxonomy(
'block', // nume intern = nume taxonomie care poate fi citit de mașină
'static_content', // tipul obiectului = post, page, link, sau tip-postare-personalizat
array(
'hierarchical' => true,
'labels' => array(
'name' => __( 'Blocuri' ),
'singular_name' => __( 'Bloc' ),
'add_new_item' => 'Adaugă Bloc Nou',
'edit_item' => 'Editează Bloc',
'new_item' => 'Bloc Nou',
'search_items' => 'Caută Bloc',
'not_found' => 'Nu s-a găsit niciun Bloc',
'not_found_in_trash' => 'Nu s-a găsit niciun Bloc în coșul de gunoi',
),
'query_var' => true, // activează interogările specifice taxonomiei
'rewrite' => array( 'slug' => 'block' ), // permalink-uri frumoase pentru taxonomia ta?
)
);
}
add_action('init', 'my_custom_taxonomies', 0);
EDITARE: Vreau doar ca elementul taxonomiei să fie prezent când tema este instalată. Nu trebuie să fie adăugat automat la niciun termen gol.

Actualizare din 2020
Versiune | Descriere |
---|---|
5.5.0 |
A introdus argumentul default_term . |
Începând cu lansarea WordPress versiunea 5.5.0, acum poți specifica un termen implicit atunci când înregistrezi o nouă taxonomie personalizată folosind argumentul foarte util default_term
.
$args = [
/...
'default_term' => [ //(string|array) Termen implicit utilizat pentru taxonomie.
'name' => 'Cartof', //(string) Numele termenului implicit.
'slug' => 'cartof', //(string) Slug-ul pentru termenul implicit.
'description' => 'Poți petrece noaptea în interiorul unui cartof, https://www.youtube.com/watch?v=h2mj-7-Zklw', //(string) Descrierea termenului implicit.
],
/...
];

Aruncați o privire aici:
În esență, ceea ce trebuie să faceți este să utilizați hook-ul save_post pentru a verifica termenii articolului și să adăugați termenul implicit din taxonomia dvs. dacă este gol.
Dacă doriți doar să aveți un termen inițial setat în taxonomia personalizată, atunci puteți utiliza wp_insert_term()
. Probabil cel mai ușor este să-l adăugați în aceeași funcție pe care o utilizați pentru a crea taxonomia personalizată. După cum menționează t3ios în comentarii, ar trebui să apelați mai întâi get_term()
și să inserați termenul doar dacă valoarea returnată este null (adică termenul nu există).
Acest exemplu de cod este preluat din Codex: http://codex.wordpress.org/Function_Reference/wp_insert_term
$parent_term = term_exists( 'fruits', 'product' ); // se returnează un array dacă este dată taxonomia
$parent_term_id = $parent_term['term_id']; // obține ID-ul numeric al termenului
wp_insert_term(
'Măr', // termenul
'product', // taxonomia
array(
'description'=> 'Un măr delicios.',
'slug' => 'mar',
'parent'=> $parent_term_id
)
);

@anu Cred că nu m-am explicat suficient de bine, voiam doar să am acea taxonomie acolo atunci când tema este instalată. Nu trebuie să aibă niciun termen dacă este goală.

@anu Excelent, aș vrea să-ți pot vota răspunsul de mai multe ori. Am editat întrebările. Unde anume ar trebui să plasez codul pe care l-ai scris mai sus?

Codul pe care l-am adăugat este doar un exemplu (și este din codex-ul WordPress) - deci va trebui să-l modifici după necesități. Cel mai bun loc pentru a-l adăuga ar fi chiar înainte de acolada de închidere a funcției.

Și dacă funcționează, acceptă răspunsul bifându-l! Asta e mai bine decât voturi suplimentare ;)

Ești sigur că vrei să rulezi insert-ul în acea funcție? Rulează la init, adică la fiecare pagină, nu cred că vrei să rulezi insert-ul de fiecare dată când este accesată o pagină, nu-i așa? Poate că funcția de insert returnează null/false dacă există deja un termen cu acel nume (nu am verificat), dar oricum asta pare puțin inutil (de ce nu apelezi get_term(s) pentru a verifica dacă există și să inserezi doar dacă nu există).

Categoria implicită este un caz hardcodat în funcția wp_insert_post()
.
Deci nu poate fi replicată exact, dar poți să o gestionezi în alte moduri. Aș încerca să folosesc un hook pentru tranziția stării postării pentru postările noi și să atribui termenul implicit dorit dacă nu a fost atribuit niciunul în timpul creării postării.

Am avut nevoie să populez o taxonomie personalizată "Zile" cu zilele săptămânii... Nu am vrut ca clientul să se încurce cu crearea zilelor, sau să intre și să șteargă zile sau să scrie greșit zilele. Urmând sfatul de mai sus, am creat acest cod, dar mă întreb dacă există o modalitate mai concisă de a-l scrie:
/*************************************** ...Crează o Taxonomie Personalizată pentru zile ******************************/
add_action( 'init', 'build_taxonomies', 0 );
function build_taxonomies() {
register_taxonomy(
'days',
'schedule',
array( 'hierarchical' => true,
'label' => 'Zile',
'query_var' => true,
'show_ui' => false, // elimină meniurile din panoul de administrare și panoul de editare
'rewrite' => true ) );
/*---------------------------------------Verifică dacă zilele sunt create..dacă nu, le creează----*/
$parent_term = term_exists( 'days', 'days' ); // se returnează un array dacă este dată taxonomia
$parent_term_id = $parent_term['term_id']; // obține ID-ul numeric al termenului
wp_insert_term(//acesta ar trebui probabil să fie un array, dar tot primeam erori..
'Luni', // termenul
'days', // taxonomia
array(
'slug' => 'luni',
'parent'=> $parent_term_id ));
wp_insert_term(
'Marți', // termenul
'days', // taxonomia
array(
'slug' => 'marti',
'parent'=> $parent_term_id ));
wp_insert_term(
'Miercuri', // termenul
'days', // taxonomia
array(
'slug' => 'miercuri',
'parent'=> $parent_term_id ));
wp_insert_term(
'Joi', // termenul
'days', // taxonomia
array(
'slug' => 'joi',
'parent'=> $parent_term_id ));
wp_insert_term(
'Vineri', // termenul
'days', // taxonomia
array(
'slug' => 'vineri',
'parent'=> $parent_term_id ));
wp_insert_term(
'Sâmbătă', // termenul
'days', // taxonomia
array(
'slug' => 'sambata',
'parent'=> $parent_term_id ));
wp_insert_term(
'Duminică', // termenul
'days', // taxonomia
array(
'slug' => 'duminica',
'parent'=> $parent_term_id ));
}
/************ acum adaug propria mea cutie meta pentru zile pentru a elimina controalele suplimentare *************/
add_action('admin_menu', 'add_custom_categories_box');
function add_custom_categories_box() {
add_meta_box('myrelateddiv', 'Zile*', '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>

Folosind plugin-ul Termen Implicit puteți face acest lucru
register_taxonomy( 'custom-tax', array('post'), array(
'label' => 'Etichetă Personalizată',
'public' => true,
'show_ui' => true,
'default_term' => 'Un Termen Implicit', // Adăugați această linie în codul dumneavoastră
// apoi activați și dezactivați plugin-ul pentru termenul implicit pentru a salva termenii setați.
));
În mod implicit, când articolul este trimis, va salva termenul implicit la articol dacă nu este bifat niciun termen. Funcționează atât pentru taxonomii ierarhice, cât și pentru cele neierarhice.
