{"id":230866,"date":"2022-12-10T14:07:00","date_gmt":"2022-12-10T11:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230866"},"modified":"2022-12-07T12:07:38","modified_gmt":"2022-12-07T09:07:38","slug":"une-alternative-au-hook-wordpress-template_redirect","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/une-alternative-au-hook-wordpress-template_redirect\/","title":{"rendered":"Une alternative au hook WordPress template_redirect"},"content":{"rendered":"\n<p>La majorit\u00e9 du travail que je fais actuellement se concentre sur des plugins personnalis\u00e9s ou des utilitaires qui fonctionnent sur WordPress.<\/p>\n<p>Si vous deviez conceptualiser le nombre de projets que je construis sont assembl\u00e9s, vous examineriez WordPress (et tout ce qu&rsquo;il implique) comme base, puis le code a une couche qui communique avec WordPress, et qui peut communiquer avec des API tierces.<\/p>\n<p>Lorsque vous faites cela, cependant, il y a souvent un composant frontal qui n\u00e9cessite que je rende les informations dans des mod\u00e8les. Bien que la cr\u00e9ation de mod\u00e8les pour WordPress ne soit pas intrins\u00e8quement difficile (bien que j&rsquo;aurais aim\u00e9 avoir un peu plus que des balises de mod\u00e8le &#8211; comme un moteur de mod\u00e8les, c&rsquo;est un autre article), je pense qu&rsquo;il vaut la peine d&rsquo;examiner quelques fa\u00e7ons de g\u00e9rer la personnalisation mod\u00e8les que nous avons fournis avec des plugins.<\/p>\n<p>L&rsquo;une des premi\u00e8res questions qui est souvent soulev\u00e9e avec cette d\u00e9claration, cependant, est<\/p>\n<blockquote>\n<p>Pourquoi incluriez-vous des mod\u00e8les personnalis\u00e9s dans un plugin\u00a0?<\/p>\n<\/blockquote>\n<p>Et je comprends \u00e0 certains niveaux.<\/p>\n<ol>\n<li>Garder des mod\u00e8les dans un plugin brouille un peu les fronti\u00e8res entre les th\u00e8mes et les plugins, en particulier lorsque vous laissez des th\u00e8mes pour la pr\u00e9sentation et des plugins pour la logique m\u00e9tier,<\/li>\n<li>Demander aux utilisateurs de copier des fichiers de th\u00e8me d&rsquo;un emplacement \u00e0 un autre est une mauvaise exp\u00e9rience utilisateur.<\/li>\n<\/ol>\n<p>Mais il y a quelques r\u00e9futations ou peut-\u00eatre des exceptions pures et simples aux cas ci-dessus.<\/p>\n<h2>Crochet template_redirect WordPress<\/h2>\n<p>Avant de parler du hook WordPress <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a>, je veux parler un peu des points mentionn\u00e9s ci-dessus.<\/p>\n<h3>1 Mod\u00e8les dans les plugins<\/h3>\n<p>Si vous cr\u00e9ez un plugin personnalis\u00e9 qui s&rsquo;interface \u00e0 la fois avec WordPress et une API tierce ou qui utilise un type de combinaison de r\u00e9f\u00e9rentiels, d&rsquo;usines, de mod\u00e8les et de vues, vous devrez afficher ces informations sur le devant -end, et il doit \u00eatre ind\u00e9pendant du th\u00e8me.<\/p>\n<p>Cela ne signifie pas que quelqu&rsquo;un ne peut pas styliser les \u00e9l\u00e9ments de la page ou inclure le mod\u00e8le dans son travail, mais cela signifie que le plugin doit fournir un niveau d&rsquo;informations de base qui est rendu \u00e0 l&rsquo;utilisateur.<\/p>\n<h3>2 Demander aux utilisateurs de copier des fichiers est mauvais<\/h3>\n<p>Rappelez-vous le slogan qu&rsquo;Apple a une fois et souvent pr\u00e9sent\u00e9 comme &quot; <strong><a href=\"http:\/\/macdailynews.com\/2017\/12\/19\/at-tim-cooks-apple-steve-jobs-is-long-gone-and-so-is-the-it-just-works-ethos\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00c7a marche, tout simplement\u00a0?<\/a><\/strong> &quot; M\u00eame si ce n&rsquo;est peut-\u00eatre pas quelque chose dont ils parlent autant qu&rsquo;avant (voire plus du tout), j&rsquo;aime l&rsquo;id\u00e9e d&rsquo;avoir &quot;juste du travail&quot; pour l&rsquo;utilisateur, et c&rsquo;est quelque chose que j&rsquo;essaie d&rsquo;atteindre dans mon travailler.<\/p>\n<p>Ainsi, lorsqu&rsquo;il s&rsquo;agit de cr\u00e9er des mod\u00e8les ou des vues personnalis\u00e9s pour les plugins, je ne veux pas demander \u00e0 l&rsquo;utilisateur de devoir copier des fichiers. Je veux juste qu&rsquo;ils :<\/p>\n<ol>\n<li>installer le plugin,<\/li>\n<li>cliquez sur activer.<\/li>\n<\/ol>\n<p>Et c&rsquo;est tout. Le reste doit \u00eatre \u00e9vident ou bien document\u00e9.<\/p>\n<h2>Retour au crochet<\/h2>\n<p>Bon, supposons un instant que nous ayons construit un plugin, le plugin comprend plusieurs mod\u00e8les de base (ou vues selon le jargon que vous utilisez) et que les mod\u00e8les doivent \u00eatre \u00e9crits \u00e0 la racine du r\u00e9pertoire du th\u00e8me actif.<\/p>\n<p>Vous pouvez utiliser le hook <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a><\/strong> (et de nombreux plugins populaires le font). Vous pouvez en savoir plus \u00e0 ce sujet ici, mais l&rsquo;essentiel est le suivant :<\/p>\n<blockquote>\n<p>Ce hook d&rsquo;action s&rsquo;ex\u00e9cute juste avant que WordPress ne d\u00e9termine la page de mod\u00e8le \u00e0 charger. C&rsquo;est un bon crochet \u00e0 utiliser si vous avez besoin de faire une redirection en toute connaissance du contenu qui a \u00e9t\u00e9 interrog\u00e9.<\/p>\n<\/blockquote>\n<p>Et, pour \u00eatre clair, je ne dissuade pas l&rsquo;utilisation de ce crochet. Je propose juste une alternative. Et c&rsquo;est \u00e7a (car cela devrait fonctionner comme suit):<\/p>\n<ol>\n<li>activer le plugin,<\/li>\n<li>localiser le th\u00e8me actif,<\/li>\n<li>s&rsquo;ils n&rsquo;existent pas d\u00e9j\u00e0, copiez les fichiers de mod\u00e8le du plugin dans le r\u00e9pertoire racine du th\u00e8me actif<\/li>\n<\/ol>\n<p>La derni\u00e8re \u00e9tape est critique car si les fichiers de mod\u00e8le existent, il est important de ne pas les \u00e9craser principalement car l&rsquo;utilisateur aurait pu \u00e9crire ses personnalisations.<\/p>\n<p>Cela dit, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voici comment vous pouvez le faire dans une seule fonction<\/a><\/strong> (avec des commentaires pour montrer ce que vous utilisez).<\/p>\n<pre><code>&lt;?php\n\nadd_action('plugins_loaded', __NAMESPACE__. 'acmeCopyTemplates');\n\/**\n * Copies the template files from the `assets\/templates` directory to the root directory \n * of the currently active theme (if they do not already exist).\n *\/\nfunction acmeCopyTemplates()\n{\n    \/\/ Find the currently active theme.\n    $activeThemeDir = get_template_directory();\n\n    \/**\n     * Read all of the template files from assets\/templates into an array but\n     * exclude the '.' and the '..' from the array.\n     *\/\n    $templates = array_slice(scandir(dirname(__FILE__).'\/assets\/templates'), 2);\n\n    \/**\n     * Now copy all of these files to the active theme directory.\n     * If the file already exists, then don't do it.\n     *\/\n    foreach ($templates as $template) {\n        if (!file_exists($destination = trailingslashit($activeThemeDir).$template)) {\n            continue;\n        }\n\n        $source = dirname(__FILE__).'\/assets\/templates\/'.$template;\n        $destination = trailingslashit($activeThemeDir).$template;\n\n        copy($source, $destination);\n    }\n}\n<\/code><\/pre>\n<p>Notez que cela utilise plusieurs fonctions PHP. \u00c0 savoir:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.array-slice.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_slice<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.scandir.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scander<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.dirname.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dirname<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.file-exists.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">le fichier existe<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.copy.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">copie<\/a><\/strong><\/li>\n<\/ul>\n<p>Je pense que tous ces \u00e9l\u00e9ments sont pratiques et importants \u00e0 conna\u00eetre, quelle que soit la nature dans laquelle vous les utilisez.<\/p>\n<h2>Les h\u00e9bergeurs prennent-ils cela en charge\u00a0?<\/h2>\n<p>Certains h\u00f4tes le font. Je sais pertinemment que les h\u00f4tes comme <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEngine<\/a><\/strong> ne le font pas et ce n&rsquo;est pas non plus une critique de l&rsquo;h\u00f4te. Certains le font pour des raisons de s\u00e9curit\u00e9 ; d&rsquo;autres l&rsquo;autorisent, mais cela ne signifie pas qu&rsquo;ils sont moins s\u00e9curis\u00e9s &#8211; cela signifie simplement que leur infrastructure est configur\u00e9e diff\u00e9remment.<\/p>\n<p>En fin de compte, cela montre qu&rsquo;il existe d&rsquo;autres moyens de rendre les mod\u00e8les disponibles pour les utilisateurs lorsqu&rsquo;un plugin est utilis\u00e9, mais ce n&rsquo;est pas le seul moyen, et cela peut ne pas toujours fonctionner.<\/p>\n<p>Cependant, avoir des options est une bonne chose, surtout si vous pr\u00e9f\u00e9rez une architecture sp\u00e9cifique dans votre plugin plut\u00f4t qu&rsquo;une autre.<\/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>Quand il s&rsquo;agit de cr\u00e9er des mod\u00e8les personnalis\u00e9s pour les plugins, je veux qu&rsquo;ils fonctionnent et voici une alternative \u00e0 la fonction WordPress template_redirect.<\/p>\n","protected":false},"author":1,"featured_media":236109,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,801,862],"tags":[1167],"class_list":["post-230866","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-php-3","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230866","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=230866"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230866\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}