Custom Post Types & champs
WordPress ne sert pas que des articles. Crée tes propres types de contenu.
4.1Créer un Custom Post Type
Un CPT, c'est un nouveau type de contenu qui s'ajoute à côté des articles et des pages. Exemple : tu veux un type "Projet" pour afficher ton portfolio.
Dans ton functions.php (ou mieux, dans un plugin custom) :
<?php
add_action('init', function() {
register_post_type('projet', [
'labels' => [
'name' => 'Projets',
'singular_name' => 'Projet',
'add_new_item' => 'Ajouter un projet',
'edit_item' => 'Modifier le projet',
],
'public' => false, // Pas de front-end WordPress
'show_ui' => true, // Visible dans wp-admin
'show_in_rest' => true, // Exposé via l'API REST !
'rest_base' => 'projets', // /wp-json/wp/v2/projets
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
'has_archive' => false,
'menu_icon' => 'dashicons-portfolio',
]);
});Résultat : tu as maintenant un endpoint /wp-json/wp/v2/projets dans ton API. Tu peux créer, modifier et lister tes projets depuis l'admin WordPress, et les consommer depuis Next.js.
4.2Taxonomies personnalisées
Les catégories et tags sont des taxonomies natives. Tu peux créer les tiennes pour organiser tes CPT :
<?php
add_action('init', function() {
register_taxonomy('technologie', ['projet'], [
'labels' => [
'name' => 'Technologies',
'singular_name' => 'Technologie',
],
'public' => false,
'show_ui' => true,
'show_in_rest' => true, // Obligatoire pour l'API
'rest_base' => 'technologies',
'hierarchical' => false, // Comme des tags (pas de parent/enfant)
]);
});Maintenant tu peux taguer tes projets avec "React", "Next.js", "WordPress" et les filtrer via l'API :
# Tous les projets avec la technologie "react" (ID = 5)
/wp-json/wp/v2/projets?technologies=54.3Champs personnalisés avec ACF
Le titre et le contenu, c'est limité. Pour un projet, tu veux aussi : l'URL du site, le repo GitHub, le client, la date de livraison... C'est là qu'ACF (Advanced Custom Fields) entre en jeu.
| Nom du champ | Slug | Type |
|---|---|---|
| URL du site | url_site | URL |
| Repo GitHub | repo_github | URL |
| Client | client | Texte |
| Date de livraison | date_livraison | Date |
| Technologies | stack | Checkbox |
Assigne ce groupe au post type "Projet". Tes champs apparaissent maintenant dans l'éditeur WordPress.
4.4Exposer les champs ACF dans l'API
Par défaut, ACF n'inclut pas ses champs dans l'API REST. Il faut activer cette option dans les réglages du groupe de champs, ou le faire en PHP :
<?php
// Dans ACF > Groupe de champs > Réglages
// Cocher "Show in REST API" = Oui
// OU en PHP (pour plus de contrôle) :
add_filter('acf/settings/show_admin', '__return_true');
// Les champs ACF apparaissent dans la clé "acf" de la réponse :
// GET /wp-json/wp/v2/projets/42
// {
// "id": 42,
// "title": { "rendered": "Mon portfolio" },
// "acf": {
// "url_site": "https://monprojet.fr",
// "repo_github": "https://github.com/user/projet",
// "client": "Startup XYZ",
// "date_livraison": "2025-06-15",
// "stack": ["react", "nextjs", "tailwind"]
// }
// }4.5Bonnes pratiques de modélisation
- Un CPT par concept métier : "Projet", "Témoignage", "Formation", pas un CPT fourre-tout.
- Noms en anglais pour les slugs :
projectplutôt queprojet. L'API est plus lisible. - Taxonomies pour le tri : si tu filtres souvent par un critère, c'est une taxonomie, pas un champ ACF.
- Champs ACF pour les données : les infos spécifiques à un élément (URL, prix, date) sont des champs.
- Teste toujours l'API : crée un CPT, ajoute du contenu, vérifie le JSON. N'attends pas d'être côté Next.js pour découvrir un problème.