Custom Post Type

Avant de parler de Custom Post Type (CPT) voici un petit rappel sur c’est qu’est un Default Post Types (DPT).

Il existe de nombreux Default Post Types, en voici quelques exemples :

  • Post (Post Type: ‘post’)
  • Page (Post Type: ‘page’)
  • Attachment (Post Type: ‘attachment’)
  • Revision (Post Type: ‘revision’)
  • Navigation menu (Post Type: ‘nav_menu_item’)
  • Block templates (Post Type: ‘wp_template’)
  • Template parts (Post Type: ‘wp_template_part’)

En général on s’intéresse surtout aux Articles (Post Type: ‘post’) et aux Pages (Post Type: ‘page’) que l’on va pouvoir utiliser dans nos boucles WordPress pour les afficher ou l’on veut.

Pour afficher les 10 derniers articles sur notre page d’accueil, on pourrait simplement ajouter ceci dans notre index.php

 
<?php 
// Debut de la boucle - Si il y a des posts et tant qu'il y a des posts 
if ( have_posts() ) : while ( have_posts() ) : the_post(); 
// On affiche le titre du post 
the_title(); 
// On affiche le contenu du post 
the_content(); 
// Fin de la boucle - On referme notre while et notre if 
endwhile; endif; 
?> 

Qu’est-ce qu’un Custom Post Type ?

Un Custom Post Type est donc un nouveau type de post que l’on va ajouter en plus des Default Post Types.

Pourquoi utiliser un Custom Post Type ?

Un CPT va permettre d’ajouter un nouveau type de post dans l’administration de WordPress. Cela permet de bien séparer les différents types de posts dans l’admin de WordPress et donc de mieux organiser le contenu.
On pourrait tout à fait séparer différents type de contenus en utilisant les catégories mais parfois il est preferable de faire appel aux Custom Post Types pour mieux organiser son contenu.
Par exemple, pour une plateforme de streaming avec des films et des series, on pourrait organiser le contenu en utilisant des catégories (Film et Série) ou bien des CPT (Film et Série).

Comment créer un nouveau CPT ?

Il existe plusieurs méthodes pour créer un CPT, soit directement dans le fichier functions.php de notre thème :

function wporg_custom_post_type() {
	register_post_type('wporg_product',
		array(
			'labels'      => array(
				'name'          => __('Films', 'textdomain'),
				'singular_name' => __('Film', 'textdomain'),
			),
				'public'      => true,
				'has_archive' => true,
				'rewrite'     => array( 'slug' => 'film' ),
		)
	);
}
add_action('init', 'wporg_custom_post_type');

On peut également s’aider d’un générateur de code comme wp-hasty.com pour créer notre CPT

https://www.wp-hasty.com/tools/wordpress-custom-post-type-generator/

L’autre méthode consiste à utiliser un plugin comme Custom Post Type UI pour générer notre CPT.

https://fr.wordpress.org/plugins/custom-post-type-ui/

Une fois notre CPT créé, il ne nous reste plus qu’à créer des posts pour notre CPT puis les afficher dans notre thème.

Pour générer des posts rapidement afin de tester notre CPT on peut utiliser le plugin FakerPress :

https://fr.wordpress.org/plugins/fakerpress/

 Comment afficher nos CPT sur notre site ?

Il faut maintenant ajouter une boucle dans notre theme pour afficher nos CPT.

Toujours dans notre fichier index.php on peut écrire ceci :

<?php
// On définit des arguments pour notre boucle WordPress personnalisée
$args = array(
	'post_type' => array('film'),
);
// On créé une nouvelle requête à partir de nos arguments
$query = new WP_Query( $args );
// Debut de la boucle - Si il y a des posts et tant qu'il y a des posts 
if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
// On affiche le titre du post 
the_title(); 
// On affiche le contenu du post 
the_content();
// Find de la boucle - On referme notre while et notre if 
endwhile; endif;
// On rétabli le fonctionnement "normal" de la boucle WordPress
wp_reset_postdata();
?>

On notera plusieurs differences entre la boucle standard de WordPress pour les DPT et la boucle personnalisées pour les CPT.

Dans la boucle standard :

  • Pas d’arguments, c’est le Post Type Post (les articles) par default
  • Pas de $query, c’est la requête par default qui s’applique
  • Pas de wp_reset_postdata(), pas besoin de réinitialiser la boucle WP

Dans la boucle personnalisée :

  • Des arguments sous la forme d’un array, ici on définit le post_type qui nous intéresse (film)
  • Une nouvelle requête qui contient nos arguments
  • La fonction wp_reset_postdata(), pour rétablir le fonctionnement normal de WordPress

Quelques liens utiles pour aller plus loin :

https://developer.wordpress.org/themes/basics/the-loop/

https://developer.wordpress.org/plugins/post-types/registering-custom-post-types/

https://developer.wordpress.org/plugins/post-types/working-with-custom-post-types/

https://codex.wordpress.org/fr:La_Boucle

https://www.wp-hasty.com/tools/wordpress-wp-query-loop-generator/