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 😉

Soyez le premier à commenter !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publié le 19 octobre 2016
par Willy Bahuaud
Catégorie Développement WordPress