Un custom post type (CPT) WordPress est un type de contenu au delà des cinq intégrés (post, page, attachment, revision, nav_menu_item). Les CPTs permettent de stocker du contenu structuré comme des produits, événements, biens immobiliers, recettes, témoignages ou portfolios, chacun avec son propre menu d’admin, écran d’édition, taxonomies, structure d’URL et hiérarchie de templates. Les custom post types ont été introduits dans WordPress 2.9 (décembre 2009) et sont devenus l’approche standard avec register_post_type() dans WordPress 3.0 (juin 2010). Un CPT est enregistré en PHP via register_post_type( $slug, $args ) sur le hook init, ou visuellement via des plugins comme Custom Post Type UI (plus de 700.000 installations actives), Pods (plus de 100.000) et Meta Box (plus de 400.000). Depuis WordPress 5.0 (décembre 2018) les CPTs peuvent activer l’éditeur de blocs en mettant show_in_rest à true, ce qui les expose aussi sur l’API REST à /wp-json/wp/v2/<slug>. WooCommerce enregistre le CPT product plus shop_order, shop_coupon, product_variation et dix autres. The Events Calendar utilise tribe_events. ACF Pro peut enregistrer les CPTs via son interface depuis la version 6.1 (mars 2023). Les custom post types restent l’épine dorsale de tout site WordPress non blog en 2025.
Quand utiliser un custom post type ?
- Produits e commerce (WooCommerce).
- Événements (Events Calendar tribe_events).
- Biens immobiliers.
- Portfolios.
- Témoignages, membres d’équipe, FAQ.
- Recettes avec données structurées.
- Offres d’emploi.
Enregistrer un custom post type
add_action( 'init', 'mysite_register_product_cpt' );
function mysite_register_product_cpt() {
$args = array(
'labels' => array( 'name' => 'Produits', 'singular_name' => 'Produit' ),
'public' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'produits' ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
'menu_icon' => 'dashicons-cart',
);
register_post_type( 'product', $args );
}Arguments importants
| Argument | Rôle |
|---|---|
| public | Définit show_ui, publicly_queryable, exclude_from_search par défaut. |
| show_in_rest | Obligatoire pour l’éditeur de blocs et le endpoint REST. |
| has_archive | Crée une archive à /<slug>/. |
| supports | Fonctionnalités activées : title, editor, thumbnail, excerpt, custom-fields. |
| rewrite | Slug d’URL. |
Plugin contre thème
Enregistrez les CPTs toujours dans un plugin, jamais dans le thème. Sinon, lorsqu’on change de thème, le CPT disparaît du menu d’admin et le contenu devient inaccessible.
Hiérarchie de templates
- Single : single-product.php, single.php, singular.php, index.php.
- Archive : archive-product.php, archive.php, index.php.
CPTs et API REST
Avec show_in_rest => true le CPT est disponible à /wp-json/wp/v2/<rest_base>. Les frontends headless consomment ce endpoint.
Plugins qui enregistrent les CPTs sans code
- Custom Post Type UI (plus de 700.000 installations).
- ACF Pro 6.1+ (enregistre les CPTs depuis mars 2023).
- Pods Framework.
- Meta Box.
- Toolset Types.
Performance
- Tout le contenu CPT vit dans wp_posts. Performance identique jusqu’à ~100.000 lignes.
- N’enregistrez pas plus de 20 à 30 CPTs par site.
- Flush rewrite rules une fois à l’activation du plugin.
- Centaines de milliers d’entrées : envisager une table dédiée (WooCommerce HPOS depuis 8.0 août 2023).
Erreurs courantes
- Mauvais hook. Utilisez init.
- Oubli de show_in_rest.
- Pas de flush des rewrite rules.
- Enregistrement dans le thème.
- Collision de slug avec une page.
Ce que vérifie InspectWP
InspectWP détecte les custom post types dans le HTML rendu et explore les endpoints REST API lorsqu’ils sont exposés. Le rapport identifie les fournisseurs populaires (WooCommerce, Events Calendar, ACF).