{"id":231425,"date":"2022-12-23T11:01:00","date_gmt":"2022-12-23T08:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231425"},"modified":"2022-12-07T10:47:56","modified_gmt":"2022-12-07T07:47:56","slug":"inclure-des-modeles-personnalises-dans-nos-plugins-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/inclure-des-modeles-personnalises-dans-nos-plugins-wordpress\/","title":{"rendered":"Inclure des mod\u00e8les personnalis\u00e9s dans nos plugins WordPress"},"content":{"rendered":"\n<p>Je pense que l&rsquo;un des aspects les plus sous-estim\u00e9s &#8211; ou peut-\u00eatre l&rsquo;un des aspects rarement discut\u00e9s du d\u00e9veloppement de plugins personnalis\u00e9s &#8211; est la possibilit\u00e9 d&rsquo;inclure des mod\u00e8les personnalis\u00e9s dans nos plugins WordPress.<\/p>\n<p>Et, pour \u00eatre honn\u00eate, je comprends: je suis quelqu&rsquo;un qui est assez convaincu de ce que devrait \u00eatre un plugin et de ce que devrait \u00eatre un th\u00e8me.<\/p>\n<p>C&rsquo;est-\u00e0-dire:<\/p>\n<ul>\n<li>les th\u00e8mes sont pour la pr\u00e9sentation,<\/li>\n<li>les plugins sont des fonctionnalit\u00e9s.<\/li>\n<\/ul>\n<p>Si j&rsquo;inclus des mod\u00e8les dans un plugin, est-ce que je ne fais pas la m\u00eame chose que lorsque les d\u00e9veloppeurs incluent des fonctionnalit\u00e9s dans leurs th\u00e8mes\u00a0?<\/p>\n<p>Comme pour tant de choses en d\u00e9veloppement, je pense que cela d\u00e9pend. Je veux dire, ajouter beaucoup de fonctionnalit\u00e9s qui vous enferment dans un th\u00e8me est quelque chose dont je ne suis pas fan. De m\u00eame, si vous avez un plugin destin\u00e9 \u00e0 pr\u00e9senter des donn\u00e9es sur le front-end et qui est ind\u00e9pendant du th\u00e8me, cela a du sens.<\/p>\n<p>Il faut donc \u00eatre judicieux dans ses d\u00e9cisions.<\/p>\n<p>Quoi qu&rsquo;il en soit, il existe un ensemble commun d&rsquo;\u00e9tapes que nous pouvons utiliser lors de l&rsquo;inclusion de mod\u00e8les personnalis\u00e9s dans nos plugins WordPress.<\/p>\n<p>Et c&rsquo;est ce que ce post va montrer.<\/p>\n<p>Si vous comptez inclure des mod\u00e8les personnalis\u00e9s dans le plug-in, je suppose que vous utilisez \u00e0 la fois des mod\u00e8les uniques et des mod\u00e8les d&rsquo;archive. Sinon, utilisez uniquement les crochets et le code ci-dessous dont vous avez besoin.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bad43f3a.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bad43f3a.png\" alt=\"Inclure des mod\u00e8les personnalis\u00e9s dans nos plugins WordPress\" ><\/a><\/p>\n<p>Pour les deux, cependant, sachez ceci\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/single_template\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">single_template<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/archive_template\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">archive_template<\/a><\/li>\n<\/ul>\n<p>En utilisant ces crochets, vous pouvez indiquer \u00e0 WordPress o\u00f9 r\u00e9sident les mod\u00e8les personnalis\u00e9s dans votre plugin.<\/p>\n<h3>Organisation des mod\u00e8les<\/h3>\n<p>Pour moi, j&rsquo;ai g\u00e9n\u00e9ralement un\u00a0 r\u00e9pertoire de <strong>mod\u00e8les<\/strong> dans mon plugin qui se situe au m\u00eame niveau que les\u00a0 r\u00e9pertoires <strong>assets, src<\/strong> et <strong>vendor<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bb112f53.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bb112f53.png\" alt=\"Inclure des mod\u00e8les personnalis\u00e9s dans nos plugins WordPress\" ><\/a><\/p>\n<p>Cela permet de savoir facilement o\u00f9 ils r\u00e9sident et fournit un moyen coh\u00e9rent de les inclure dans tous les plugins que vous avez cr\u00e9\u00e9s. Apr\u00e8s tout, il y a quelque chose \u00e0 dire pour \u00eatre coh\u00e9rent dans les conventions que nous utilisons.<\/p>\n<h3>Y compris les mod\u00e8les<\/h3>\n<p>En supposant que vous ayez\u00a0 un mod\u00e8le <strong>single-acme.php<\/strong> et un mod\u00e8le <strong>archive-acme.php<\/strong>, il est facile de l&rsquo;inclure. Et bien que je sois plus fan de l&rsquo;utilisation de la programmation orient\u00e9e objet, je montrerai pour inclure ces mod\u00e8les \u00e0 l&rsquo;aide de code proc\u00e9dural.<\/p>\n<p>Il est facile de convertir ce code en code orient\u00e9 objet si vous le souhaitez. De plus, je vais supposer que vous l&rsquo;incluez \u00e9galement pour les types de publication personnalis\u00e9s.<\/p>\n<p>Vous pouvez toujours omettre une condition pour un type de publication personnalis\u00e9 si vous souhaitez simplement inclure ces mod\u00e8les, mais d&rsquo;apr\u00e8s mon exp\u00e9rience, je trouve qu&rsquo;il est rare que ces situations n&rsquo;utilisent pas de types de publication personnalis\u00e9s, mais je ne connais pas votre situation.<\/p>\n<p>Cela dit, voici le code.<\/p>\n<h4>D\u00e9finir des crochets<\/h4>\n<p>Tout d&rsquo;abord, nous devons d\u00e9finir les crochets. C&rsquo;est relativement simple puisque nous allons utiliser les crochets d\u00e9crits ci-dessus.<\/p>\n<p>Tout d&rsquo;abord, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-02-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le template unique<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('single_template', 'acmeIncludeSingleTemplate');\n\/**\n * Includes a custom, single template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeSingleTemplate($originalTemplate)\n{\n   \/\/ More to come...\n}<\/code><\/pre>\n<p>Et puis <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-03-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le mod\u00e8le d&rsquo;archive<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('archive_template', 'acmeIncludeArchiveTemplate');\n\/**\n * Includes a custom, archive template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalArchiveTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeArchiveTemplate($originalArchiveTemplate)\n{\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>Et maintenant, nous pouvons impl\u00e9menter le code pour chacune des fonctions.<\/p>\n<h4>Ajout du code<\/h4>\n<p>Donc, d&rsquo;abord, nous allons regarder <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-00-acme-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le mod\u00e8le unique<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('single_template', 'acmeIncludeSingleTemplate');\n\/**\n * Includes a custom, single template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeSingleTemplate($originalTemplate)\n{\n  $singleTemplate = plugin_dir_path(\n    dirname(\n      __DIR__) );\n  $singleTemplate .= '\/templates\/single-acme.php';\n\n  if ('acme-cpt' === get_post_type(get_the_ID())) {\n      if (file_exists($singleTemplate)) {\n          return $singleTemplate;\n      }\n  }\n\n  return $originalTemplate;\n}<\/code><\/pre>\n<p>Et maintenant <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-01-acme-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le mod\u00e8le d&rsquo;archive<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('archive_template', 'acmeIncludeArchiveTemplate');\n\/**\n * Includes a custom, archive template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalArchiveTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeArchiveTemplate($originalArchiveTemplate)\n{\n  $archiveTemplate = plugin_dir_path(\n    dirname(\n      __DIR__) );\n  $archiveTemplate .= '\/templates\/archive-acme.php';\n\n  if ('acme-cpt' === get_post_type(get_the_ID())) {\n      if (file_exists($archiveTemplate)) {\n          return $archiveTemplate;\n      }\n  }\n\n  return $originalArchiveTemplate;\n}<\/code><\/pre>\n<p>Si vous avez pr\u00eat\u00e9 une attention particuli\u00e8re au code, vous savez qu&rsquo;il y a tr\u00e8s peu de diff\u00e9rences. En fait, le processus g\u00e9n\u00e9ral peut \u00eatre d\u00e9crit comme suit :<\/p>\n<ol>\n<li>d\u00e9finir le crochet,<\/li>\n<li>localiser le mod\u00e8le,<\/li>\n<li>v\u00e9rifier le type de message personnalis\u00e9,<\/li>\n<li>le mod\u00e8le existe, utilisez-le<\/li>\n<li>sinon, utilisez le mod\u00e8le par d\u00e9faut<\/li>\n<\/ol>\n<p>Et c&rsquo;est le processus pour les mod\u00e8les uniques et d&rsquo;archives.<\/p>\n<h3>\u00c9crire des mod\u00e8les compatibles<\/h3>\n<p>Et enfin, et c&rsquo;est important surtout si vous voulez rendre le mod\u00e8le aussi agnostique que possible, j&rsquo;essaie d&rsquo;utiliser autant de balises de mod\u00e8le WordPress int\u00e9gr\u00e9es que possible lors de l&rsquo;affichage du contenu li\u00e9 au plugin. Cela permet aux d\u00e9veloppeurs de th\u00e8mes de le styliser facilement pour l&rsquo;adapter \u00e0 leur th\u00e8me.<\/p>\n<p>Non, vous ne pourrez pas accueillir tous les th\u00e8mes, mais telle est la nature des th\u00e8mes WordPress. Le but est de prendre autant de travail de r\u00e9cup\u00e9ration et de rendu des donn\u00e9es du mod\u00e8le que possible afin que les d\u00e9veloppeurs frontaux puissent facilement le g\u00e9rer.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il existe un ensemble commun d&rsquo;\u00e9tapes que nous pouvons utiliser lors de l&rsquo;inclusion de mod\u00e8les personnalis\u00e9s dans nos plugins WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,832,801,841,862],"tags":[1167],"class_list":["post-231425","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-guide-pour-les-debutants","category-php-3","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231425","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=231425"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/231425\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=231425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=231425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=231425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}