{"id":234231,"date":"2023-02-17T12:48:00","date_gmt":"2023-02-17T09:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234231"},"modified":"2022-11-12T01:18:54","modified_gmt":"2022-11-11T22:18:54","slug":"creer-des-types-de-publication-personnalises-et-des-taxonomies-personnalisees-dans-wordpress-par-code","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/creer-des-types-de-publication-personnalises-et-des-taxonomies-personnalisees-dans-wordpress-par-code\/","title":{"rendered":"Cr\u00e9er des types de publication personnalis\u00e9s et des taxonomies personnalis\u00e9es dans WordPress par code"},"content":{"rendered":"\n<p>Il s&rsquo;agit d&rsquo;un tutoriel sur la fa\u00e7on de cr\u00e9er un type de publication personnalis\u00e9 et une taxonomie personnalis\u00e9e dans WordPress par code. Nous verrons les pi\u00e8ges courants et les arguments \u00e0 utiliser pour une cr\u00e9ation minimale mais suffisante. Exemple complet inclus \u00e0 la fin.<\/p>\n<h2>O\u00f9 ajouter le code<\/h2>\n<p>La cr\u00e9ation de types de publication personnalis\u00e9s (CPT) et de taxonomies personnalis\u00e9es dans WordPress peut \u00eatre effectu\u00e9e dans le fichier d&rsquo;un th\u00e8me <code>functions.php<\/code>ou dans un plugin. Gardez \u00e0 l&rsquo;esprit que le type de publication personnalis\u00e9 et la taxonomie personnalis\u00e9e dispara\u00eetront si vous changez de th\u00e8me ou d\u00e9sactivez le plug-in. Il est donc s\u00fbr de supprimer temporairement l&rsquo;enregistrement CPT du th\u00e8me et de le d\u00e9placer dans un plugin &#8211; tant que vous conservez le m\u00eame type de message personnalis\u00e9 ou le m\u00eame slug\/ID d&rsquo;identifiant de taxonomie.<\/p>\n<p>Pour cr\u00e9er (et modifier) \u200b\u200bun CPT ou une taxonomie, <strong>utilisez toujours<\/strong> le <code>init<\/code>crochet. Le placer \u00e0 la racine de <code>functions.php<\/code>(\u00e0 l&rsquo;ext\u00e9rieur d&rsquo;un crochet) ou de tout autre crochet causera des probl\u00e8mes.<\/p>\n<h2>Cr\u00e9ation d&rsquo;un type de publication personnalis\u00e9<\/h2>\n<p>Pour cr\u00e9er un type de publication personnalis\u00e9, vous utilisez la <code>register_post_type<\/code>fonction. Il accepte deux param\u00e8tres\u00a0; d&rsquo;abord l&rsquo;identifiant du type de publication et ensuite un tableau avec tous les arguments.<\/p>\n<p>L&rsquo;identifiant du type de publication est un nom de version slug de votre type de publication. Par exemple, les articles et les pages des types de publication int\u00e9gr\u00e9s de WordPress sont identifi\u00e9s par &lsquo; <code>post<\/code>&lsquo; et &lsquo; <code>page<\/code>&lsquo;. L&rsquo;identifiant doit \u00eatre unique, il doit suivre un ensemble de r\u00e8gles (minuscules, pas d&rsquo;espaces, etc.) et ne pas \u00eatre l&rsquo;un des slugs r\u00e9serv\u00e9s de WordPress.<\/p>\n<p>C&rsquo;est ce que j&rsquo;ai appris pour \u00eatre les arguments minimum mais parfaitement suffisants pour enregistrer un type de publication; \u00e9tant donn\u00e9 qu&rsquo;il s&rsquo;agit d&rsquo;un CPT public normal et que vous souhaitez remplacer tous les libell\u00e9s indiquant &quot;post&quot; ou &quot;page&quot; par le nom r\u00e9el de votre CPT\u00a0:<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n});<\/code><\/pre>\n<h3>Un aper\u00e7u des arguments<\/h3>\n<p>Sachez que certains des arguments h\u00e9ritent des valeurs d&rsquo;autres arguments. \u00c0 moins qu&rsquo;ils ne soient explicitement d\u00e9finis, ils peuvent avoir par d\u00e9faut la m\u00eame valeur ou l&rsquo;oppos\u00e9 d&rsquo;un autre. Plusieurs arguments h\u00e9ritent de la m\u00eame valeur ou de la valeur oppos\u00e9e de l&rsquo;argument <code>public<\/code>. Lisez <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_post_type\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentation<\/a> pour voir quelle est la valeur par d\u00e9faut pour chaque argument et si vous devez la remplacer.<\/p>\n<p>Si vous \u00eates d&rsquo;accord pour avoir des textes dans l&rsquo;administration qui font r\u00e9f\u00e9rence \u00e0 votre type de message comme &quot;post&quot; ou &quot;page&quot;, vous pouvez ignorer la d\u00e9finition des arguments d&rsquo;\u00e9tiquette. Vous serez probablement d&rsquo;accord avec seulement <code>label<\/code>(nom au pluriel) et \u00e0 l&rsquo;int\u00e9rieur du <code>labels<\/code>tableau juste <code>singular_name<\/code>(nom au singulier).<\/p>\n<p>Si vous ne d\u00e9finissez pas explicitement la <code>show_in_rest<\/code>valeur true, votre type pos personnalis\u00e9 utilisera l&rsquo;ancien \u00e9diteur classique. <strong>Si vous souhaitez utiliser l&rsquo;\u00e9diteur Gutenberg pour votre type de publication personnalis\u00e9, vous devez d\u00e9finir <code>show_in_rest<\/code>sur true<\/strong>.<\/p>\n<p>L&rsquo; <code>supports<\/code>argument indique quels \u00e9l\u00e9ments sont disponibles lors de la modification d&rsquo;un article dans votre type d&rsquo;article. Au minimum, vous voulez probablement le titre, l&rsquo;\u00e9diteur et l&rsquo;image de publication en vedette.<\/p>\n<p>L&rsquo; <code>rewrite<\/code>argument avec le minimum d&rsquo;\u00e9l\u00e9ment de tableau <code>slug<\/code>indique \u00e0 WordPress de r\u00e9\u00e9crire tous les articles singuliers de votre type d&rsquo;article pour utiliser ce slug de pr\u00e9fixe. Dans l&rsquo;exemple ci-dessus, un article de livre singulier obtiendrait une URL du type\u00a0; &quot; <a href=\"http:\/\/example.com\/book\/i-robot\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">http:\/\/example.com\/book\/i-robot\/<\/a> &quot;. Si vous souhaitez savoir comment ajouter un param\u00e8tre de r\u00e8gle de permalien dans l&rsquo;administrateur pour permettre aux utilisateurs du th\u00e8me de d\u00e9cider eux-m\u00eames de ce slug, consultez <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-a-custom-permalink-setting-for-your-custom-post-type\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">cet article<\/a>.<\/p>\n<p>L&rsquo;argument de l&rsquo;ic\u00f4ne de menu (<code>menu_icon<\/code>) peut \u00eatre l&rsquo;un des <a href=\"https:\/\/developer.wordpress.org\/resource\/dashicons\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Dashicons<\/a> suivants, ou vous pouvez le laisser vide pour conserver la valeur par d\u00e9faut. La valeur par d\u00e9faut est la m\u00eame ic\u00f4ne que les publications. C&rsquo;est cependant une bonne id\u00e9e de s\u00e9parer clairement vos types de publication personnalis\u00e9s.<\/p>\n<p>La position du menu (<code>menu_position<\/code>) vous permet de d\u00e9cider de la position de votre type de message personnalis\u00e9 dans le menu admin. La documentation r\u00e9pertorie toutes les positions du menu d&rsquo;administration, vous pouvez donc vous ajuster. la position 5 est juste apr\u00e8s &lsquo;Messages&rsquo;.<\/p>\n<p>Il y a un autre argument (<code>taxonomies<\/code>) pour attacher une taxonomie au type de publication. Nous verrons comment ajouter une taxonomie personnalis\u00e9e plus loin dans cet article. Pour ajouter des taxonomies \u00e0 votre type de publication, ajoutez cet argument au tableau ci-dessus\u00a0;<\/p>\n<pre><code>'taxonomies' =&gt; ['book_author'],<\/code><\/pre>\n<h3>Une note sur les permaliens et les erreurs 404 introuvables<\/h3>\n<p>Apr\u00e8s avoir ajout\u00e9 votre code pour enregistrer un type de message personnalis\u00e9, vous remarquerez que l&rsquo;affichage d&rsquo;un seul message renverra l&rsquo;erreur &quot;404 introuvable&quot;. C&rsquo;est parce que vous devez &quot;rafra\u00eechir les permaliens&quot;.<\/p>\n<p>Allez dans Param\u00e8tres &gt; Permaliens, et cliquez simplement sur le bouton &quot;Enregistrer les modifications&quot; (pas besoin de changer quoi que ce soit).<\/p>\n<p>Gardez \u00e0 l&rsquo;esprit que chaque fois que vous modifiez l&rsquo; <code>rewrite<\/code>attribut, vous devrez \u00e0 nouveau actualiser les permaliens.<\/p>\n<h2>Cr\u00e9ation d&rsquo;une taxonomie personnalis\u00e9e<\/h2>\n<p>Une taxonomie personnalis\u00e9e peut \u00eatre attach\u00e9e \u00e0 l&rsquo;un des types de publication de WordPress (publications, pages) ou \u00e0 un type de publication personnalis\u00e9. Vous pouvez \u00e9galement attacher plusieurs taxonomies \u00e0 un type de publication. Lorsque vous enregistrez une taxonomie, vous devez fournir le ou les types de publication auxquels vous souhaitez qu&rsquo;elle soit jointe.<\/p>\n<p>Une taxonomie peut \u00eatre hi\u00e9rarchique (comme les cat\u00e9gories de publication o\u00f9 vous pouvez cr\u00e9er une structure arborescente) ou bas\u00e9e sur des balises (comme les balises de publication). C&rsquo;est vraiment la seule consid\u00e9ration que vous devez conna\u00eetre au pr\u00e9alable, \u00e0 l&rsquo;exception de son identifiant slug. Comme pour les CPT, la limace d&rsquo;identification d&rsquo;une taxonomie doit \u00eatre unique et suivre un ensemble de r\u00e8gles.<\/p>\n<p>Pour enregistrer une taxonomie personnalis\u00e9e, vous utilisez la <code>register_taxonomy<\/code>fonction. Le <code>register_taxonomy<\/code>accepte le slug d&rsquo;identifiant unique de taxonomie comme premier argument, un tableau de types de publication auquel l&rsquo;attacher en second, et enfin un tableau avec tout le reste des arguments. Il y a beaucoup d&rsquo;arguments, mais c&rsquo;est ce que j&rsquo;ai v\u00e9cu comme \u00e9tant le minimum mais suffisant pour enregistrer une taxonomie personnalis\u00e9e (cela ajoute une taxonomie de type balise\/non hi\u00e9rarchique):<\/p>\n<pre><code>add_action('init', function() {\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n});<\/code><\/pre>\n<p>Il est recommand\u00e9 d&rsquo;ajouter un appel de fonction juste apr\u00e8s le <code>register_taxonomy<\/code>, pour s&rsquo;assurer qu&rsquo;il est correctement \u00abattach\u00e9\u00bb au CPT: <code>register_taxonomy_for_object_type<\/code>. D\u00e9finissez votre taxonomie comme premier argument et le CPT comme second\u00a0:<\/p>\n<pre><code>register_taxonomy_for_object_type('book_author', 'book');<\/code><\/pre>\n<p>De m\u00eame que le type de message ci-dessus, <code>register_taxonomy<\/code>accepte beaucoup plus d&rsquo;arguments, et beaucoup d&rsquo;entre eux h\u00e9ritent ou d\u00e9pendent de la valeur d&rsquo;autres arguments. Lisez <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/register_taxonomy\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la documentation<\/a> pour voir quelle est la valeur par d\u00e9faut pour chaque argument et si vous devez la remplacer.<\/p>\n<h3>Un aper\u00e7u des arguments<\/h3>\n<p>Si vous \u00eates d&rsquo;accord pour avoir des textes qui font r\u00e9f\u00e9rence \u00e0 votre taxonomie en tant que &quot;tag&quot; (si hi\u00e9rarchique est faux) ou &quot;cat\u00e9gorie&quot; (si hi\u00e9rarchique est vrai), vous pouvez probablement ignorer tout le <code>labels<\/code>tableau \u00e0 l&rsquo;exception peut-\u00eatre de <code>singular_name<\/code>.<\/p>\n<p>Le <code>show_admin_column<\/code>est pratique pour ajouter une colonne montrant les termes associ\u00e9s dans votre taxonomie dans votre \u00e9cran d&rsquo;administration CPT. Tout comme dans les publications, vous voyez une colonne affichant les cat\u00e9gories associ\u00e9es. Cet argument est d\u00e9fini par d\u00e9faut sur <code>false<\/code>(ne pas afficher la colonne), donc j&rsquo;aime le remplacer.<\/p>\n<p>La d\u00e9finition <code>show_in_rest<\/code>sur true est n\u00e9cessaire pour que votre taxonomie soit visible dans Post edit dans l&rsquo;\u00e9diteur Gutenberg, car Gutenberg s&rsquo;appuie sur l&rsquo;API REST.<\/p>\n<p>De m\u00eame qu&rsquo;avec les types de publication personnalis\u00e9s, vous obtiendrez probablement des erreurs &quot;404 introuvables&quot; sur votre taxonomie personnalis\u00e9e. Allez dans Param\u00e8tres&gt; Permaliens et cliquez simplement sur le bouton &quot;Enregistrer les modifications&quot;.<\/p>\n<h2>Exemple de code complet<\/h2>\n<p>Voici un exemple complet de cr\u00e9ation d&rsquo;un CPT pour les livres et d&rsquo;association de deux taxonomies personnalis\u00e9es\u00a0; genre (hi\u00e9rarchique) et auteur du livre (tag).<\/p>\n<pre><code>add_action('init', function() {\n    register_post_type('book', [\n        'label' =&gt; __('Books', 'txtdomain'),\n        'public' =&gt; true,\n        'menu_position' =&gt; 5,\n        'menu_icon' =&gt; 'dashicons-book',\n        'supports' =&gt; ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'],\n        'show_in_rest' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book'],\n        'taxonomies' =&gt; ['book_author', 'book_genre'],\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Book', 'txtdomain'),\n            'add_new_item' =&gt; __('Add new book', 'txtdomain'),\n            'new_item' =&gt; __('New book', 'txtdomain'),\n            'view_item' =&gt; __('View book', 'txtdomain'),\n            'not_found' =&gt; __('No books found', 'txtdomain'),\n            'not_found_in_trash' =&gt; __('No books found in trash', 'txtdomain'),\n            'all_items' =&gt; __('All books', 'txtdomain'),\n            'insert_into_item' =&gt; __('Insert into book', 'txtdomain')\n        ],      \n    ]);\n\u00a0\n    register_taxonomy('book_genre', ['book'], [\n        'label' =&gt; __('Genres', 'txtdomain'),\n        'hierarchical' =&gt; true,\n        'rewrite' =&gt; ['slug' =&gt; 'book-genre'],\n        'show_admin_column' =&gt; true,\n        'show_in_rest' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Genre', 'txtdomain'),\n            'all_items' =&gt; __('All Genres', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Genre', 'txtdomain'),\n            'view_item' =&gt; __('View Genre', 'txtdomain'),\n            'update_item' =&gt; __('Update Genre', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Genre', 'txtdomain'),\n            'new_item_name' =&gt; __('New Genre Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Genres', 'txtdomain'),\n            'parent_item' =&gt; __('Parent Genre', 'txtdomain'),\n            'parent_item_colon' =&gt; __('Parent Genre:', 'txtdomain'),\n            'not_found' =&gt; __('No Genres found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_genre', 'book');\n\u00a0\n    register_taxonomy('book_author', ['book'], [\n        'label' =&gt; __('Authors', 'txtdomain'),\n        'hierarchical' =&gt; false,\n        'rewrite' =&gt; ['slug' =&gt; 'book-author'],\n        'show_admin_column' =&gt; true,\n        'labels' =&gt; [\n            'singular_name' =&gt; __('Author', 'txtdomain'),\n            'all_items' =&gt; __('All Authors', 'txtdomain'),\n            'edit_item' =&gt; __('Edit Author', 'txtdomain'),\n            'view_item' =&gt; __('View Author', 'txtdomain'),\n            'update_item' =&gt; __('Update Author', 'txtdomain'),\n            'add_new_item' =&gt; __('Add New Author', 'txtdomain'),\n            'new_item_name' =&gt; __('New Author Name', 'txtdomain'),\n            'search_items' =&gt; __('Search Authors', 'txtdomain'),\n            'popular_items' =&gt; __('Popular Authors', 'txtdomain'),\n            'separate_items_with_commas' =&gt; __('Separate authors with comma', 'txtdomain'),\n            'choose_from_most_used' =&gt; __('Choose from most used Authors', 'txtdomain'),\n            'not_found' =&gt; __('No Authors found', 'txtdomain'),\n        ]\n    ]);\n    register_taxonomy_for_object_type('book_author', 'book');\n});<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un guide pour cr\u00e9er des types de publication personnalis\u00e9s et des taxonomies personnalis\u00e9es dans WordPress par code. Couvre les arguments \u00e0 utiliser pour une cr\u00e9ation minimale mais suffisante.<\/p>\n","protected":false},"author":1,"featured_media":152888,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[915,893,893,717,717,915,1110,801,801,925,925,841,841,862,862],"tags":[1167],"class_list":{"0":"post-234231","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-autre","8":"category-code-2","10":"category-developpeur","13":"category-n-a","14":"category-php-3","16":"category-sujets","18":"category-tutoriels","20":"category-wordpress-3","22":"tag-affiai-fr"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234231"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234231\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/152888"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}