Aller au contenu principal
Version: 0.7.3

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 :

  1. Un fichier app/PostTypes/MyPost.php
  2. Le type de contenu est automatiquement enregistré dans WordPress
  3. 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