Assigner un terme de taxonomie par défaut

Lorsque l’on crée un article dans WordPress et que l’on omet de lui définir une catégorie, le système lui attribue un terme « par défaut ». L’idée des concepteurs de cette fonctionnalité est de forcer tous les articles à appartenir au moins à une catégorie, afin de pouvoir facilement retrouver le contenu dans les archives.

Cette fonctionnalité a été pensé lorsque WordPress n’était encore qu’un simple moteur de blog, et son utilité est aujourd’hui discutable. Lors de l’entrée en scène des taxonomies et types de contenus personnalisés (WordPress 3.1), ce système de « terme par défaut » n’a donc pas été porté sur ces éléments.

Ce qui est amusant – dans le code source – c’est que l’attribution de la catégorie par défaut est codé de façon relativement rigide. Alors si vous avez un jour besoin de faire quelque chose de similaire avec un custom post type et une custom taxonomy, vous ne pourrez pas emprunter la méthode « native » ; voici ce qu’il faudra faire…

Assigner un terme de taxonomie lors de la sauvegarde

Imaginons que vous ayez un type de contenu mon-cpt et une taxonomie ma-taxo. Pour le besoin d’un projet vous avez besoin que tous les éléments de mon-cpt soient assignés a au moins un terme de ma-taxo, car ce type de contenu n’a pas d’archive : ces éléments n‘apparaissent sur le site que via les archives de termes.

Nous allons donc créer une fonction qui s’exécutera lors de l’action wp_insert_post (c’est à dire lorsque l’élément vient d’être enregistré dans la base WordPress). Puis dans ce hook :

  1. On vérifie que le type de contenu en train d’être sauvegardé est bien celui qui nous intéresse ;
  2. on récupère la liste des termes liés à ce contenu ;
  3. si cette liste est vide, alors on assigne à cet objet le terme default-term grâce à la fonction wp_set_object_terms.
add_action( 'wp_insert_post', 'willy_set_default_term', 10, 3 );
function willy_set_default_term( $post_id, $post, $update ) {
	$cpt  = 'mon-cpt';
	$taxo = 'ma-taxo';
	$term = 'default-term';
	if ( $post->post_type == $cpt ) {
		if ( empty( wp_get_post_terms( $post_id, $taxo ) ) ) {
			wp_set_object_terms( $post_id, $term, $taxo );
		}
	}
}
le code, version synthétique

Et voilà, le tour est joué… ce bout de code peut être adapté et déposé dans le fichier functions.php de votre thème aussi bien que dans une extension.

Une option d’interface pour le choix du terme par défaut

Le code précédent fonctionne, mais il ne colle pas tout à fait à la fonctionnalité originelle de la « catégorie par défaut » ; pour celle-ci WordPress permet à l’utilisateur de choisir le nom du terme qu’il souhaite attribuer automatiquement. Cela se passe dans l’administration, dans les réglages d’écriture.

On peut faire pareil, il suffit de remplacer l’astuce de code précédente par celle ci-dessous.

add_action( 'admin_init', 'willy_register_default_taxo_term' );
function willy_register_default_taxo_term() {
	register_setting( 'writing', 'default_taxo_term' );
	
	$taxo = 'ma-taxo';
	$term = 'default-term';
	add_settings_field(
		'default_taxo_term',
		'Terme de taxonomie par défaut',
		'wp_dropdown_categories',
		'writing',
		'default',
		array(
			'taxonomy'   => $taxo,
			'hide_empty' => false,
			'selected'   => get_option( 'def_tax_term', $term ),
		)
	);
}

add_action( 'wp_insert_post', 'willy_set_default_term', 10, 3 );
function willy_set_default_term( $post_id, $post, $update ) {
	$cpt  = 'mon-cpt';
	$taxo = 'ma-taxo';
	$term = 'default-term';
	if ( $post->post_type == $cpt ) {
		if ( empty( wp_get_post_terms( $post_id, $taxo ) ) ) {
			wp_set_object_terms( $post_id, 
				get_option( 'def_tax_term', $term ),
				$taxo );
		}
	}
}
Le même code avec une option

De la ligne 1 à la ligne 19 nous avons mis en place une action dont le rôle est de créer notre option d’administration, et d’afficher un sélecteur des termes disponibles dans la page des réglages d’écriture.

Puis, ligne 28, nous avons adapté notre bout de code pour que le choix du terme à insérer par défaut soit lié à cette option.

Désactiver l’attribution du terme par défaut lors de l’update

Pour finir avec cette astuce, je voulais vous préciser qu’il est possible de faire pour que l’attribution du terme ne se fasse que lors du premier enregistrement. C’est à dire s’arranger pour forcer un terme de taxonomie à la création, puis de laisser ensuite l’utilisateur décocher toutes les catégories s’il le souhaite.

On joue simplement sur le troisième argument du hook wp_insert_post, qui indique à la fonction s’il s’agit d’une création ou d’une mise à jour de contenu.

add_action( 'wp_insert_post', 'willy_set_default_term', 10, 3 );
function willy_set_default_term( $post_id, $post, $update ) {
	if ( $update ) {
		return;
	}
	$cpt  = 'mon-cpt';
	$taxo = 'ma-taxo';
	$term = 'default-term';
	if ( $post->post_type == $cpt ) {
		if ( empty( wp_get_post_terms( $post_id, $taxo ) ) ) {
			wp_set_object_terms( $post_id, 
				get_option( 'def_tax_term', $term ),
				$taxo );
		}
	}
}
assignation du terme à la création uniquement

D’autres astuces de code à venir…

Cela fait quelques temps que j’hésitais à publier sur mon blog des articles un peu plus succincts. J’adore rédiger des articles de fond, mais ceux-ci me prennent beaucoup de temps à écrire. Je vais continuer de vous en préparer, mais en parallèle je pense que quelques code-snippets comme celui-ci peuvent vous servir.

J’espère que la série d’astuces à venir vous permettra de résoudre des problèmes que vous aviez autrement l’habitude de contourner ;)

(je pose ici un petit test de référencement, merci de ne pas tenir compte de cette phrase : refrehjfrjozecdoi ezidjezdzo)

Contacter l'auteur :

willy bahuaud

Je suis Willy Bahuaud, développeur spécialiste de WordPress. Mon travail est de créer d’intervenir sur la partie « technique » des projets WordPress de mes clients. Je développe des extensions (espaces membres, géolocalisation, annuaires…) pour étendre les fonctionnalités d’un site au delà de ce que WordPress ou le thème en place ne le permettent. J'interviens aussi régulièrement sur la migration de contenus, l’optimisation de thème, la création de passerelles de données, l’adaptation de plugins premium et la création de sites .
Vous pouvez me contacter pour me faire part de vos projets.

Pas encore de commentaire, vous êtes le premier !

Commenter