Aller au contenu

Types de contenu personnalisés

Les types de contenu personnalisés (Custom Post Types) permettent d’étendre ArtisanCMS au-dela des pages et articles standard. Vous pouvez créer des structures de données adaptées à vos besoins : témoignages, membres d’équipe, produits, portfolios, etc.

Le système repose sur deux modèles principaux :

  • ContentType : définit la structure d’un type de contenu (le “moule”)
  • ContentEntry : représente une entrée individuelle d’un type donné (le “contenu”)
// Un ContentType "Témoignage" contient plusieurs ContentEntry
$type = ContentType::where('slug', 'temoignages')->first();
$entries = $type->entries; // Collection de ContentEntry

Le modèle ContentType (App\Models\ContentType) définit les propriétés d’un type de contenu :

ChampTypeDescription
namestringNom affiché (ex: “Témoignages”)
slugstringIdentifiant unique (ex: “temoignages”)
iconstringIcone affichée dans le menu admin
descriptiontextDescription du type de contenu
fieldsjsonConfiguration des champs personnalisés
has_archivebooleanActive une page d’archive publique
is_activebooleanActive/désactive le type

Le CPT Builder est accessible dans l’administration via Admin\ContentTypeController. L’interface permet de :

  1. Définir le nom, le slug et l’icone
  2. Rédiger une description
  3. Configurer les champs associés
  4. Activer ou désactiver la page d’archive

Une fois créé, le type de contenu apparait automatiquement dans le menu latéral de l’administration avec son icone dédiée.

Chaque entrée de contenu (App\Models\ContentEntry) est liée à un ContentType :

class ContentEntry extends Model
{
use HasContentFeatures; // Révisions, taxonomies, champs personnalisés
use HasSiteScope; // Filtrage multi-site
use SoftDeletes;
}
ChampTypeDescription
content_type_idintegerRéférence vers le ContentType
titlestringTitre de l’entrée
slugstringIdentifiant URL unique
contentjsonContenu structuré
statusstringStatut de publication
featured_imagestringImage mise en avant
orderintegerOrdre d’affichage

Le Admin\ContentEntryController gère les opérations CRUD pour les entrées de chaque type :

// Routes générées dynamiquement par type
Route::resource('content-entries/{contentType}', ContentEntryController::class);

L’interface d’édition s’adapte automatiquement aux champs définis dans le ContentType.

Nom : Témoignages
Slug : temoignages
Champs : auteur (text), poste (text), entreprise (text), note (number), photo (image)
Nom : Équipe
Slug : equipe
Champs : poste (text), bio (wysiwyg), photo (image), linkedin (url), email (email)
Nom : Portfolio
Slug : portfolio
Champs : client (text), date_projet (date), url_projet (url), galerie (repeater > image)
Nom : FAQ
Slug : faq
Champs : question (text), reponse (wysiwyg), categorie (select)

Grace au trait HasContentFeatures, chaque entrée de contenu bénéficie :

Les entrées de types de contenu personnalisés sont accessibles publiquement si l’option has_archive est activée. Le rendu utilise les templates Blade correspondants ou un template par défaut.