Créer un CPT
Custom Post Type
Générer un nouveau type de contenu
Pour créer un nouveau Custom Post Type dans Elementum, utilisez la commande suivante :
php dobby make:post MyPost
Configuration interactive
La commande vous posera quelques questions pour configurer votre type de contenu :
- Nom du menu : Le nom qui apparaîtra dans le menu d'administration
- Nom au singulier (en minuscule) : Utilisé pour les boutons et les libellés (ex: "article")
- Nom au pluriel (en minuscule) : Utilisé pour les intitulés au pluriel (ex: "articles")
remarque
Toutes ces questions sont optionnelles. Si vous ne répondez pas, des valeurs par défaut seront générées automatiquement à partir du nom de la classe.
Structure générée
La commande crée automatiquement :
- Un fichier
app/PostTypes/MyPost.php - Le type de contenu est automatiquement enregistré dans WordPress
- Toutes les méthodes publiques de la classe sont exécutées lors de l'enregistrement
Exemple complet
1. Création du type de contenu
php dobby make:post Recipes
2. Fichier généré
app/PostTypes/Recipes.php
<?php use Carbon_Fields\Field; use Elementum\Abstract\PostType; class Recipes extends PostType { /** * @var string */ const string SLUG = "recipes"; public function __construct() { /** * Définition des propriétés du PostType */ $this->slug = self::SLUG; $this->menuName = 'Recettes'; $this->labels = [ 'plural' => 'recettes', 'singular' => 'recette', ]; $this->isMale = false; /** * @see https://developer.wordpress.org/resource/dashicons/ */ $this->icon = 'dashicons-food'; $this->options['position'] = 3; $this->setTitlePlaceholder('Nom de la recette'); /** * Gestion des colonnes */ $this->columns = [ "remove" => ["date"], "add" => [ "recipes_duration" => "Durée (min.)", "date" => "Date", ], ]; $this->makeSortable("recipes_duration"); /** * Appel du constructeur de la class parente * ! Doit être appelé en dernier */ parent::__construct(); } }
Récupérer les éléments
Dans un contrôleur
app/Controller/RecipesController.php
#[Template('post_type_archive', params: [Recipes::SLUG])] public function recipesArchive() { // Récupère une instance WP_Query des recettes $recipesQuery = $this->getPostType(Recipes::SLUG)->getQuery(); return $this->render('archive-recipes.html.twig', compact('recipesQuery')); }
Dans un template Twig
views/archive-recipes.html.twig
<div class="recipes-list"> {% wp_query recipesQuery %} <article class="recipe"> <h2><a href="{{ post.link }}">{{ post.title }}</a></h2> {% if post.thumbnail %} <img src="{{ post.thumbnail.src|resize(300, 200) }}" alt="{{ post.thumbnail.alt }}"> {% endif %} <div class="excerpt"> {{ post.get_preview(25, true, 'Voir la recette') }} </div> </article> {% endwp_query %} </div>
Bonnes pratiques
- Utilisez des noms de classes en PascalCase
- Les noms de types de contenu doivent être en minuscules et utiliser des underscores
- Placez la logique métier dans des contrôleurs dédiés
- Utilisez les hooks WordPress pour étendre les fonctionnalités si nécessaire