Créer des types de post personnalisés sous WordPress

Créer des types de post personnalisés sous WordPress

Catégories du post

La création d’un type de post personnalisé peut parfois être nécessaire pour diverses raisons :

  • créer un type de contenu qui ne répond pas à la logique des posts, des pages ou des médias déjà présents dans WordPress
  • attribuer un template spécifique à un type de post qui pourra être créé à loisir par l’administrateur du site
  • avoir la possibilité d’ajouter des champs personnalisés qui ne seraient par pertinent pour les autres types de contenu du site

Pour les besoins de ce petit tuto, nous allons créer un type de post « Livre ». On lui associera une icône pour l’administration, on verra également qu’il sera possible de lui créer son propre emplacement dans le menu d’administration appelé Bibliothèque, puis on lui créera une taxonomie avec le lexique littéraire.

Création du type de post

Pour créer votre propre type de post, rendez vous dans le fichier functions.php à la racine de votre thème et tapez-y le code suivant :

function add_post_types() {
	$labels = array('name'                     => 'Bibliothèque',
			        'singular_name'            => 'Livre',
			        'add_new'                  => 'Ajouter',
			        'add_new_item'             => 'Ajouter un livre',
			        'edit_item'                => 'Modifier',
			        'new_item'                 => 'Créer',
			        'view_item'                => 'Voir',
			        'view_items'               => 'Voir la bibliothèque',
			        'search_items'             => 'Chercher dans la bibliothèque',
			        'not_found'                => 'Livre non trouvé',
			        'not_found_in_trash'       => 'Livre non trouvé dans la corbeille',
			        'all_items'                => 'Liste de livres',
			        'archives'                 => 'Archives des livres',
			        'attributes'               => 'Informations du livre',
			        'items_list'               => 'Liste de livres'
    );
	register_post_type('book', ['label' => 'Livre',	
								'labels' => $labels,						
								'menu_icon' => 'dashicons-book',
                                'public' => true,
								'show_ui' => true,
                               'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt')
	]);
}
add_action('init', 'add_post_types');

Ce que l’on fait ici :

  • Premièrement, on déclare un tableau qui va contenir tous nos « labels », c’est à dire tous les termes qui vont définir :
    • le nom du type de post, au singulier; au pluriel
    • le nom de la liste de ce type de post
    • le texte qui est affiché quand on le modifie, l’ajoute, etc.
    • etc.
  • Ensuite, on enregistre le type de post (register_post_type()), en lui spécifiant le nom qui sera utilisé dans le code si on en a besoin. Ici en l’occurrence, ce sera ‘book’, sans majuscules.
    • On transmet ensuite le tableau de labels qu’on a créé juste au dessus
    • On choisit une icône qui le représentera dans le menu d’administration. Pour ce faire, il suffit de se rendre sur https://developer.wordpress.org/resource/dashicons, de récupérer le nom de l’icône qui nous intéresse et de le préfixer par ‘dashicons-‘. Ici, j’ai tout simplement choisi l’icône d’un livre que j’identifie avec ‘dashicons-book’.
    • On indique que ce type de contenu est ‘public’ et qu’il peut être consulté sur le site par les internautes.
    • On déclare ensuite qu’on veut voir apparaitre ce nouveau type de post dans le menu d’administration (show_ui). Ce paramètre n’est pas obligatoire, puisqu’il prend la valeur de ‘public’ si celle-ci a été définie.
  • On indique enfin à WordPress, grâce au hook add_action(), que l’on veut qu’il ajoute l’enregistrement de ce type de post personnalisé lorsqu’il s’initialise.

J’ai choisi ici de ne créer ce nouveau type de post qu’avec le paramétrage minimal pour en faciliter la compréhension. Il existe, en réalité, tout un tas de paramètres qui peuvent répondre à d’autres besoins lors de la création d’un nouveau type de post. Dans la documentation officielle, vous pouvez trouver la liste complète de ces paramètres.

Juste un petit exemple : vous pouvez demander à WordPress de ne pas créer un nouvel emplacement dans le menu d’administration pour votre type de post, mais de le placer plutôt en tant que sous-menu du menu « Pages ». Pour ça, il vous faudrait passer le paramètre : ‘show_in_menu => ‘edit.php?post_type=page’. Il y a tout un tas de choses paramétrables, donc n’hésitez pas à jeter un oeil.

Maintenant que nous avons créé notre type de post, on peut avoir besoin d’une taxonomie spécifique pour lui. C’est ce que nous allons voir maintenant.

Création de la taxonomie relative à notre type de post

Tout d’abord, qu’est-ce que la taxonomie ? C’est un terme un poil barbare pour dire « les étiquettes (tags) et les catégories ». Dans WordPress, il existe deux manières de classifier le contenu :

  • de manière hiérarchique (catégories)
  • de manière non hiérarchique (étiquettes/tags)

C’est important à la fois :

  • pour l’organisation du contenu
  • pour la navigation entre les différents posts qui ont la même taxonomie
  • pour le référencement, vous pouvez utiliser les étiquettes comme mots-clés et vous pouvez également avoir une URL pointant vers la liste de x ou y catégorie de contenu
  • pour améliorer la pertinence de certaines requêtes en php/sql permettant de trouver différents posts en se basant sur leur taxonomie

Rendez-vous dans functions.php à la racine de votre thème et tapez le code suivant :

function add_post_types_tags_and_categories() {
	$tags_labels = array('name'                       => 'Etiquettes de livre',
						 'singular_name'              => 'Etiquette de livre',
						 'search_items'               => 'Chercher dans les étiquettes de livre',
						 'popular_items'              => 'Etiquettes de livre populaires',
				         'all_items'                  => 'Liste des étiquettes de livre',
				         'add_new_item'               => 'Ajouter une étiquette de livre',
				         'not_found'                  => 'Aucune étiquette de livre trouvée.',
				         'items_list'                 => 'Etiquettes de livres'
						);

	register_taxonomy('book_tags', 'book', ['labels' => $tags_labels, 'show_ui' => true, 'hierarchical' => false]);

	$categories_labels = array('name'                       => 'Genres littéraires',
							   'singular_name'              => 'Genre littéraire',
							   'search_items'               => 'Chercher dans les genres littéraires',
							   'popular_items'              => 'Genres littéraires populaires',
						       'all_items'                  => 'Liste des genres littéraires',
						       'parent_item'                => 'Genre littéraire parent',
						       'parent_item_colon'          => 'Genre littéraire parent:',
						       'add_new_item'               => 'Ajouter un genre littéraire',
						       'not_found'                  => 'Aucun genre littéraire trouvé.',
						       'items_list'                 => 'Genres littéraires'
							);

	register_taxonomy('book_categories', 'book', ['labels' => $categories_labels, 'show_ui' => true, 'hierarchical' => true]);

}

add_action('init', 'add_post_types_tags_and_categories');

Je ne vais pas m’attarder sur la description de chacune des lignes, je pense qu’elles parlent d’elles même.

Remarquez par contre que nous avons créé deux tableaux de ‘labels’, puis fait deux appels à la fonction register_taxonomy(). La différence entre les deux étant que nous avons d’abord créé une taxonomie non hiérarchique (hierarchical => false) puis une taxonomie hiérarchique. Ce qui correspond à ce que nous décrivions plus haut : les catégories et les étiquettes.

Il existe également tout un tas de paramétrage que vous pouvez trouver ici.

A noter que pour des besoins de clarté je n’ai pas ajouté les fonctions de traduction pour chacune des phrases, mais que c’est tout à fait possible en utilisant les fonctions __() et _x().

Ca donnerait par exemple : ‘name’ => _x(‘Genres littéraires’, ‘taxonomy book name’)

Ci-dessus, je viens de créer un livre. Vous pouvez voir dans le menu à gauche, que j’ai bien ma section « Bibliothèque » contenant à la fois le listing des livres, la capacité à en ajouter de nouveaux mais également la possibilité de gérer les étiquettes et les genres littéraires que je veux.

Vous constaterez que, dans la colonne de droite, j’ai associé une étiquette et une catégorie à mon livre. Les catégories apparaissent automatiquement quand elles sont créées, par contres les étiquettes ne fonctionnent pas de la même manière. Si vous voulez voir apparaitre une étiquette que vous avez créé au préalable, vous allez devoir commencer à taper son nom dans le champ et vous pourrez ensuite la sélectionner.

Il ne reste plus maintenant qu’à créer un template spécifique pour ce type de post.

Récupérer ces types de post depuis n’importe quelle page

Pour récupérer ces posts, il suffira maintenant d’utiliser la fonction get_pages();

$booksList = get_pages(array('post_type' => 'book'));

Attention toutefois, pour pouvoir récupérer ces types de page, il vous faudra passer la variable hierarchical de register_post_type() à true.

register_post_type('book', ['label' => 'Livre',	
								'labels' => $labels,						
								'menu_icon' => 'dashicons-book',
                                'public' => true,
								'show_ui' => true, 
                                'hierarchical' => true

Création d’un template pour le type de post

Il existe plusieurs manières de créer un template pour un type de post spécifique que nous avons déjà couvert ici.

Mais il existe une dernière méthode qui n’avait pas été abordée.

Créer un fichier single-<NOM_DU_TYPE_DE_POST>.php à la racine de votre thème. Ici, ce sera single-book.php.

Et voilà, normalement, ça marche immédiatement. Si ce n’est pas le cas, rendez-vous dans Réglages > Permaliens et regénérez les permaliens.

Maintenant que vous avez votre nouveau type de post, vous aimeriez sans doute avoir des champs spécifiques (dans le cas d’un livre : nombre de pages, éditeur, galerie, etc.) qui seront exploités via votre template. Eh bien ce sera l’objet du prochain article !

Copyright image : seekpng

S’abonner
Notifier de
guest

0 Commentaires
Inline Feedbacks
Voir tous les commentaires