Come aggiungere un articolo predefinito a una tassonomia personalizzata?


10

La tassonomia predefinita (Categorie) di Wordpress ha l'elemento Non classificato per impostazione predefinita. Come aggiungere un articolo predefinito a una nuova tassonomia personalizzata?

functions.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);

EDIT: Voglio solo avere l'elemento tassonomia lì quando il tema è installato. Non deve essere aggiunto automaticamente a nessun termine vuoto .

Risposte:


8

Dai un'occhiata qui:

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

Fondamentalmente quello che devi fare è usare l'hook save_post per controllare i termini per il post e aggiungere il termine predefinito dalla tua tassonomia se è vuoto.

Se si desidera solo impostare un termine iniziale nella tassonomia personalizzata, è possibile utilizzare wp_insert_term(). Probabilmente è più facile aggiungerlo nella stessa funzione che stai usando per creare la tua tassonomia personalizzata. Come t3ios aggiunge nei commenti, è necessario chiamare get_term()prima e inserire il termine solo se il valore restituito è null (ovvero il termine non esiste).

Questo codice di esempio è tratto dal Codice: 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 Penso di non essermi spiegato molto bene, volevo solo avere quella tassonomia lì quando il tema è installato. Non deve avere alcun termine se è vuoto.
janoChen

@janoChen - Ho aggiornato la risposta
anu

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

Il codice che ho aggiunto è solo un esempio (ed è tratto dal codice WordPress) - quindi dovrai modificarlo se necessario. Il posto migliore per aggiungerlo sarebbe appena prima del controvento di chiusura della funzione.
anu,

1
Sei sicuro di voler eseguire l'inserimento in quella funzione, funziona su init, cioè. ogni pagina, non penso che tu voglia eseguire l'inserzione ogni volta che viene chiamata una pagina vero? Forse la funzione di inserimento restituisce null / false se esiste già un termine corrispondente con quel nome (non l'ho ancora guardato), ma lo stesso sembra un po 'inutile (perché non chiamare get_term (s) e vedere se esiste, quindi inserire in caso contrario).
t31os,

4

La categoria predefinita è il caso hardcoded in wp_insert_post()funzione.

Quindi non può essere replicato esattamente, ma puoi gestirlo in altri modi. Proverei ad agganciarmi alla transizione dello stato dei post per i nuovi post e assegnerei il termine predefinito desiderato se nessuno fosse assegnato durante la creazione del post.


+1 per il collegamento all'hook dello stato dei post, è esattamente quello che stavo cercando.
Matt,

0

Utilizzando il plug-in Termine predefinito è possibile farlo

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.
));

Per impostazione predefinita, quando il post viene inviato, il termine predefinito verrà salvato nel post se non ci sono termini controllati. Funziona con tassonomie sia gerarchiche che non gerarchiche.


Sarebbe bello se selezionasse automaticamente il termine specificato nella vista di creazione post, quindi l'utente è consapevole di cosa accadrà.
Garconis,

0

Avevo bisogno di popolare un "Giorni" di tassonomia personalizzata con i giorni della settimana ... Non volevo che il cliente dovesse fare confusione con la creazione di giorni, o entrare lì ed eliminare giorni o giorni di errori di ortografia. Seguendo i consigli di cui sopra mi sono inventato questo, ma mi chiedo se esiste un modo più conciso di 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>   
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.