Comment ajouter un élément par défaut à une taxonomie personnalisée?


10

Par défaut, la taxonomie par défaut de Wordpress (Catégories) contient l'élément Non classé. Comment ajouter un élément par défaut à une nouvelle taxonomie personnalisée?

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: Je veux juste avoir l'élément de taxonomie là lorsque le thème est installé. Il ne doit pas être automatiquement ajouté à un terme vide .

Réponses:


8

Jetez un œil ici:

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

Fondamentalement, ce que vous devez faire est d'utiliser le crochet save_post pour vérifier les termes de la publication et ajouter le terme par défaut de votre taxonomie s'il est vide.

Si vous souhaitez simplement définir un terme initial dans votre taxonomie personnalisée, vous pouvez l'utiliser wp_insert_term(). Il est probablement plus facile de l'ajouter dans la même fonction que celle que vous utilisez pour créer votre taxonomie personnalisée. Comme t3ios l'ajoute dans les commentaires, vous devez d' get_term()abord appeler et insérer le terme uniquement si la valeur de retour est nulle (c'est-à-dire que le terme n'existe pas).

Cet exemple de code provient du 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 Je pense que je ne me suis pas très bien expliqué, je voulais juste avoir cette taxonomie là quand le thème est installé. Il n'a pas de terme s'il est vide.
janoChen

@janoChen - Je mis à jour la réponse
anu

@anu Excellent, j'aimerais pouvoir voter davantage votre réponse. J'ai édité les questions. Où dois-je placer exactement le code que vous avez écrit ci-dessus?
janoChen

Le code que j'ai ajouté n'est qu'un exemple (et il provient du codex WordPress) - vous devrez donc le modifier si nécessaire. Le meilleur endroit pour l'ajouter serait juste avant l'accolade de fermeture de la fonction.
anu

1
Vous êtes sûr de vouloir exécuter l'insertion dans cette fonction, elle s'exécute sur init, c'est-à-dire. chaque page, je ne pense pas que vous voulez exécuter l'insertion à chaque fois qu'une page est appelée, n'est-ce pas? Peut-être que la fonction d'insertion renvoie null / false si un terme correspondant existe déjà avec ce nom (je n'ai pas regardé), mais tout de même cela semble un peu inutile (pourquoi ne pas appeler get_term (s) et voir s'il existe, alors insérer sinon).
t31os

4

La catégorie par défaut est un cas codé en dur dans la wp_insert_post()fonction.

Il ne peut donc pas être répliqué exactement, mais vous pouvez le gérer d'autres manières. J'essaierais de me connecter à la transition de statut de publication pour les nouveaux messages et d'attribuer le terme par défaut souhaité si aucun n'était attribué lors de la création du message.


+1 pour le lien vers le hook de statut du post, c'est exactement ce que je cherchais.
Matt

0

En utilisant le plugin Default Term, vous pouvez le faire

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

Par défaut, lorsque le message est soumis, il enregistrera le terme par défaut dans le message s'il n'y a pas de terme vérifié. Il fonctionne pour les taxonomies hiérarchiques et non hiérarchiques.


Ce serait bien s'il sélectionnait automatiquement le terme spécifié dans la vue de création de poste, afin que l'utilisateur sache ce qui se passerait.
Garconis

0

J'avais besoin de remplir une "jours" de taxonomie personnalisée avec les jours de la semaine. Je ne voulais pas que le client doive jouer avec la création de jours, ou y entrer et supprimer des jours ou des jours mal orthographiés. En suivant les conseils ci-dessus, j'ai trouvé cela, mais je me demande s'il existe un moyen plus concis de le coder:

 /*************************************** ...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>   
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.