Mémo sur la fonction register_post_type() de WordPress

WordPress

La fonction register_post_type() de WordPress décryptée pour personnaliser vos posts pour ceux qui veulent développer un plugin ou un thème pour WordPress. Ce mémo avec Comment Gérer est un aide-mémoire pour ne rien oublier.

register_post_type() est une fonction spécifique de WordPress qui vous permet de personnaliser un type de “posts” (Custom Post Type en anglais) en le créant et en le modifiant selon vos propres besoins et l’utilisation que vous voulez en faire.

Cette fonction s’adresse essentiellement aux développeurs de plugin ou de thème pour WordPress et demande un certain niveau de connaissances que vous seuls vous pouvez appréciez si cela vous est utile ou non.

Je développe actuellement un plugin qui a besoin d’utiliser cette fonction. Mettre à jour les spécificités de cette fonction clairement me fera gagner du temps. A vous aussi peut-être ?

publicités

Lire, travailler, décrypter en anglais c’est bien, mais il m’arrive le plus souvent d’être plus à l’aise pour comprendre certaines choses en utilisant ma langue maternelle qui est le français. Vous aussi, non ?

Pour cette raison, j’ai réalisé une traduction libre de l’anglais vers le français des explications, commentaires détaillés et fournis par Justin* pour utiliser register_post_type() correctement, pour ne rien oublier et penser à tout dans le développement d’un plugin ou d’un thème pour WordPress en utilisant cette fonction.

Dans ce cadre, c’est bien utile et je souhaite également vous le partager.

Et cela ne m’empêche pas de me permettre de faire un “gentil mélange malicieux” de français et d’anglais.

Note : La lecture du code qui suit est bien meilleure sur l’écran d’un ordinateur que sur une tablette ou un smartphone (même si le site est en “Responsive Web Design”).

<?php
 
// Enregistre la personnalisation du 'post type' dans le crochet (hook) 'init'.
add_action( 'init', 'my_register_post_types' );
 
// Registers Post Types dans une fonction personnalisée pour un plugin
function my_register_post_types() {
 
 // Mettre en place les arguments pour le 'post type'.
 $args = array(
 
  /**
  * Une brève description de votre 'post type'. Ne semble pas être utilisé tout le temps
  * dans WordPress. Certains thèmes peuvent choisir de le montrer dans les archives.

  * string/chaîne
  */
  'description' =>  __( "Une description de mon 'post type'.", "example-textdomain" ), 
 
  /**
  * Le 'post type' est public autant pour l'administrateur que pour les utilisateurs
  * 'front-end'.

  * bool (par défaut est 'FALSE')
  */
  'public'              => true, 
 
  /**
  * Effectuer les requêtes en 'front-end' avec parse_request().

  * bool (par défaut est 'public') 
  */
  'publicly_queryable'  => true,
 
  /**
  * Exclure les posts des résultats de recherche.

  * bool (par défaut est 'public')
  */
  'exclude_from_search' => false,
 
  /**
  * Montrer les posts dans le menu de navigation.

  * bool (par défaut est 'public')
  */
  'show_in_nav_menus'   => false,
 
  /**
  * Générer une interface utilisateur côté admin. D'autres contrôles sont disponibles avec
  * d'autres arguments (suivants). Pour construire votre propre interface utilisateur,
  * le passer à 'false'.

  * bool (par défaut est 'public')
  */
  'show_ui'             => true,
 
  /**
  * Montrer le 'post type' dans le menu admin. 'show_ui' doit être 'TRUE' pour fonctionner.

  * bool (lié à 'show_ui')
  */
  'show_in_menu'        => true,
 
  /**
  * Ajouter un lien rapide dans la barre d'administration de WordPress vers un nouveau
  * 'post type'.

  * bool (lié à 'show_in_menu')
  */
  'show_in_admin_bar'   => true,
 
  /**
  * L'ordre d'apparition dans le menu gauche côté administration. 'show_in_menu'
  * doit être 'TRUE' pour fonctionner. 

  * int (Par défaut est à 25 ; en-dessous de 'commentaires')
  */
  'menu_position'       => null,
 
  /**
  * L'URI de l'icône à utiliser dans le menu admin. Il n'y a pas d'argument pour l'en-tête
  * de l'icône. Vous avez besoin d'utiliser votre CSS pour en ajouter un.
  * Vous pouvez aussi utiliser les dashicons par défaut de WordPress.

  * string/chaîne (par défaut utilise l'icône du post)
  */
  'menu_icon'           => null,
 
  /**
  * Exporter les posts de 'post type' avec import/export de WordPress ou un plugin similaire.

  * bool (par défaut est 'TRUE')
  */
  'can_export'          => true,
 
  /**
  * Supprimer (tous) les posts d'un utilisateur quand celui-ci supprime son compte.

  * bool (par défaut est 'TRUE' si les posts sont du rôle 'author')
  */
  'delete_with_user'    => false,
 
  /**
  * Permettre une hiérarchie dans les 'post type' (parent/enfant/...). 

  * bool (par défaut est 'FALSE')
  */
  'hierarchical'        => false,
 
  /**
  * Si le 'post type' dispose d'une page index/archive/racine. Si 'TRUE', le nom du 'post type'
  * sera utilisé comme 'slug'. Vous pouvez aussi définir une chaîne pour contrôler
  * le nom exact du 'slug' pour l'archive.

  * bool|string (par défaut est 'FALSE')
  */
  'has_archive'         => 'example',
 
  /**
  * Définir la clé de 'query_var' pour ce type de poste. Si 'TRUE', le nom du 'post type'
  * sera utilisé.
  * Vous pouvez aussi utiliser une chaîne personnalisée pour contrôler une clé exacte.

  * bool|string (par défaut est 'TRUE' - 'post type name')
  */
  'query_var'           => 'example',
 
  /**
  * La chaîne utilisée pour construire modifier, supprimer, et lire les capacités
  * pour les 'posts type'.
  * Vous pouvez utiliser une chaîne ou un tableau (pour les formes singulier et pluriel).
  * Le tableau est utile si le pluriel ne peut pas être fait en ajoutant simplement un 's'
  * à la fin du mot. Par exemple, array( 'boite', 'boites' ).

  * string|array (par défaut est 'post')
  */
  'capability_type'     => 'example',
 
  /**
  * Si WordPress doit faire correspondre les capacités Meta (edit_post, read_post,
  * delete_post) pour votre utilisation. Si défini à FALSE, vous aurez besoin d'effectuer
  * votre propre manipulation en filtrant le hook 'map_meta_cap'.

  * bool (par défaut est 'FALSE')
  */
  'map_meta_cap'        => true,
 
  /**
  * Fournit un contrôle plus précis sur les capacités que les paramètres par défaut.
  * Par défaut, WordPress va utiliser l'argument 'capability_type' pour construire ces
  * capacités. Le plus souvent, cela se traduit par la création de nombreuses
  * fonctionnalités supplémentaires que vous n'avez probablement pas besoin.
  * Ce qui suit est un exemple pour mettre en place les capacités pour de nombreux 'post type'
  * en utilisant seulement trois capacités de base dont vous avez besoin pour affecter à
  * vos rôles : 'manage_examples', 'edit_examples', 'create_examples'.
  * Chaque 'post type' est unique, ajustez-les selon vos besoins.
  */
  'capabilities' => array(
 
   // meta caps (ne pas les assigner/ajouter à un rôle)
   'edit_post'              => 'edit_example',
   'read_post'              => 'read_example',
   'delete_post'            => 'delete_example',
 
   // primitive/meta caps
   'create_posts'           => 'create_examples',
 
   // primitive caps utilisés en dehors de map_meta_cap()
   'edit_posts'             => 'edit_examples',
   'edit_others_posts'      => 'manage_examples',
   'publish_posts'          => 'manage_examples',
   'read_private_posts'     => 'read',
 
   // primitive caps utilisés dans map_meta_cap()
   'read'                   => 'read',
   'delete_posts'           => 'manage_examples',
   'delete_private_posts'   => 'manage_examples',
   'delete_published_posts' => 'manage_examples',
   'delete_others_posts'    => 'manage_examples',
   'edit_private_posts'     => 'edit_examples',
   'edit_published_posts'   => 'edit_examples'
   ),
 
   /**
   * Comment la structure de l'URL doit être manipulée avec ce 'post type'. Vous pouvez définir
   * cela avec un tableau d'arguments spécifiques ou bien par (bool) true|false.
   * Si défini à 'FALSE', cela permet d'éviter aux règles de réécriture d'être créées.
   * Exemple avec array() :  
   */
   'rewrite' => array(
 
    /**
    * Le slug à utiliser dans un 'post type' individuel.

    * string (par défaut est le nom du 'post type')
    */
    'slug'       => 'example',
 
    /**
    * Montrer le slug $wp_rewrite->front dans le permalien.

    * bool (par défaut est 'TRUE')
    */
    'with_front' => false,
 
    /**
    * Autoriser le 'post type' individuel dans une pagination via le quicktag <!--nextpage-->

    * bool (par défaut est 'TRUE')
    */
    'pages'      => true,
 
    /**
    * Créer un 'feed' pour ce 'post type'

    * bool (par défaut est l'argument 'has_archive')
    */
    'feeds'      => true,
 
    /**
    * Assigner un masque de point final avec ce permalien (???)

    * const (par défaut est EP_PERMALINK)
    */
    'ep_mask'    => EP_PERMALINK,
    ),
 
   /**
   * WordPress propose (presque ?) tous les supports pour les 'post type'. De nombreux
   * arguments sont utiles sur l'écran d'édition d'un 'post' dans l'admin.
   * Ce qui suit peut aider le développement pour d'autres thèmes ou plugins pour décider
   * ce qu'il faut faire dans certaines situations.
   * Vous pouvez passer les arguments dans un tableau ou mettre 'FALSE' pour empêcher
   * que certains arguments soient ajoutés.
   * Vous pouvez utiliser add_post_type_support() pour ajouter des fonctionnalités
   * ou remove_post_type_support() pour supprimer des fonctionnalités plus tard. Les
   * fonctions par défaut sont 'title' et 'editor'.
   */
   'supports' => array(
 
    // Le titre du 'post' ($post->post_title).
    'title',
 
    // Le contenu du 'post' ($post->post_content).
    'editor',
 
    // La description rapide ($post->post_excerpt).
    'excerpt',
 
    // L'auteur ($post->post_author).
    'author',
 
    // L'image en vignette (Le thème de l'utilisateur doit utiliser 'post-thumbnails').
    'thumbnail',
 
    /**
    * Afficher la 'meta box' des commentaires. Si défini, tous les commentaires
    * sont autorisés sur ce 'post'.
    */
    'comments',
 
    // Afficher la 'meta box' pour envoyer des trackbacks depuis l'écran d'édition du 'post'.
    'trackbacks',
 
    /**
    * Afficher la 'meta box' champs personnalisés Displays the Custom Fields meta box.
    * Les 'post meta' sont supportés indépendamment.
    */
    'custom-fields',
 
    /**
     * Afficher la 'meta box' révision. Si défini, les révisions sont sauvegardées dans
     * la base de données.
     */
    'revisions',
 
    /**
     * Afficher la 'meta box' attributs avec la sélection d'un parent et l'ordre d'affichage
     * dans le menu (menu_order).
     */
    'page-attributes',
 
    // Afficher la 'meta box' des formats à utiliser pour ces posts.
    'post-formats',
   ),
 
   /**
   * Les 'labels' utilisés pour l'affichage des posts dans l'admin et parfois en front-end.
   * Ces 'labels' ne concernent pas les mises à jour, les messages d'erreurs ou autres.
   * Vous avez besoin de filtre le crochet 'post_updated_messages' pour les personnaliser.
   */
   'labels' => array(
    'name'               => __( 'Examples',                   'example-textdomain' ),
    'singular_name'      => __( 'Example',                    'example-textdomain' ),
    'menu_name'          => __( 'Examples',                   'example-textdomain' ),
    'name_admin_bar'     => __( 'Examples',                   'example-textdomain' ),
    'add_new'            => __( 'Add New',                    'example-textdomain' ),
    'add_new_item'       => __( 'Add New Example',            'example-textdomain' ),
    'edit_item'          => __( 'Edit Example',               'example-textdomain' ),
    'new_item'           => __( 'New Example',                'example-textdomain' ),
    'view_item'          => __( 'View Example',               'example-textdomain' ),
    'search_items'       => __( 'Search Examples',            'example-textdomain' ),
    'not_found'          => __( 'No examples found',          'example-textdomain' ),
    'not_found_in_trash' => __( 'No examples found in trash', 'example-textdomain' ),
    'all_items'          => __( 'All Examples',               'example-textdomain' ),
 
    // Labels uniquement pour la hiérarchie des 'post types'.
    'parent_item'        => __( 'Parent Example',             'example-textdomain' ),
    'parent_item_colon'  => __( 'Parent Example:',            'example-textdomain' ),
 
    /**
     * Personnaliser le label archive Custom archive label. Doit filtrer
     * 'post_type_archive_title' pour l'utiliser. */
     */
     'archive_title'      => __( 'Examples',                   'example-textdomain' ),
    )
  );
 
  // Enregistre le 'post type'.
  register_post_type(
   // Le nom du 'Post type'. 20 caractères maximum. Majuscules et espaces non autorisés.
   'example',
   // Arguments du 'post type'.
   $args
  );
}
 
?>

Comme je vous l’ai dit plus haut, ma traduction est libre. Je ne suis pas bilingue et des erreurs de traduction ou de compréhension peuvent apparaître malgré tout. N’hésitez pas à me le signaler en commentaire. Et je corrige autant que faire ce peut.

*Les sources originales (en anglais) :

Et sur WordPress pour enregistrer un CPT (Custom Post Type) :
register_post_type


Partager cette page Comment Gérer :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strong>