{"id":231193,"date":"2022-12-10T15:01:00","date_gmt":"2022-12-10T12:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231193"},"modified":"2022-12-07T12:07:40","modified_gmt":"2022-12-07T09:07:40","slug":"unalternativa-al-wordpress-template_redirect-hook","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/it\/unalternativa-al-wordpress-template_redirect-hook\/","title":{"rendered":"Un&#8217;alternativa al WordPress template_redirect Hook"},"content":{"rendered":"\n<p>La maggior parte del lavoro che faccio in questo momento si concentra su plug-in o utilit\u00e0 personalizzati che funzionano su WordPress.<\/p>\n<p>Se dovessi concettualizzare quanti dei progetti che costruisco sono messi insieme, esamineresti WordPress (e tutto ci\u00f2 che comporta) come base, e quindi il codice ha un livello che comunica con WordPress e che pu\u00f2 comunicare con API di terze parti.<\/p>\n<p>Quando si esegue questa operazione, tuttavia, c&#8217;\u00e8 spesso un componente front-end che richiede il rendering delle informazioni in modelli. Sebbene la creazione di modelli per WordPress non sia intrinsecamente difficile (anche se vorrei che avessimo qualcosa in pi\u00f9 rispetto ai tag dei modelli, come un motore di creazione di modelli, questo \u00e8 un altro post), penso che valga la pena esaminare un paio di modi in cui possiamo gestire modelli che abbiamo fornito in bundle con i plugin.<\/p>\n<p>Tuttavia, una delle prime domande che viene spesso sollevata con questa affermazione \u00e8<\/p>\n<blockquote>\n<p>Perch\u00e9 dovresti includere modelli personalizzati in un plug-in?<\/p>\n<\/blockquote>\n<p>E lo capisco su alcuni livelli.<\/p>\n<ol>\n<li>Mantenere i modelli in un plug-in offusca un po&#8217; i confini tra temi e plug-in, soprattutto quando si lasciano temi per la presentazione e plug-in per la logica aziendale,<\/li>\n<li>Chiedere agli utenti di copiare i file del tema da una posizione all&#8217;altra \u00e8 un&#8217;esperienza utente negativa.<\/li>\n<\/ol>\n<p>Ma ci sono alcune confutazioni o forse eccezioni a titolo definitivo ai casi di cui sopra.<\/p>\n<h2>WordPress template_redirect Hook<\/h2>\n<p>Prima di parlare dell&#8217;hook <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a> di WordPress, voglio parlare un po&#8217; dei punti sopra menzionati.<\/p>\n<h3>1 Modelli nei plugin<\/h3>\n<p>Se stai creando un plug-in personalizzato che si interfaccia sia con WordPress che con un&#8217;API di terze parti o che utilizza un qualche tipo di combinazione di repository, fabbriche, modelli e viste, dovrai visualizzare queste informazioni in primo piano -end, e deve essere indipendente dal tema.<\/p>\n<p>Ci\u00f2 non significa che qualcuno non possa definire lo stile degli elementi sulla pagina o includere il modello nel proprio lavoro, ma significa che il plug-in dovrebbe fornire un livello base di informazioni che viene visualizzato all&#8217;utente.<\/p>\n<h3>2 Chiedere agli utenti di copiare i file \u00e8 sbagliato<\/h3>\n<p>Ricordi lo slogan che Apple una volta e spesso pubblicizzava come &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\">Funziona e basta?<\/a><\/strong> &quot; Anche se potrebbe non essere qualcosa che sputa fuori tanto quanto una volta (se non del tutto, pi\u00f9), mi piace l&#8217;idea di avere &quot;solo lavoro&quot; per l&#8217;utente, ed \u00e8 qualcosa a cui cerco di lottare nel mio opera.<\/p>\n<p>Quindi, quando si tratta di creare modelli o viste personalizzati per i plug-in, non voglio chiedere all&#8217;utente di dover copiare i file. Voglio solo che:<\/p>\n<ol>\n<li>installa il plugin,<\/li>\n<li>fare clic su attiva.<\/li>\n<\/ol>\n<p>E questo \u00e8 tutto. Il resto dovrebbe essere ovvio o ben documentato.<\/p>\n<h2>Torna al gancio<\/h2>\n<p>Va bene, quindi supponiamo per un momento di aver creato un plug-in, il plug-in include diversi modelli di base (o viste a seconda del gergo che usi) e che i modelli devono essere scritti nella radice della directory del tema attivo.<\/p>\n<p>Puoi usare l&#8217; 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 (e molti plugin popolari lo fanno).<\/a><\/strong> Puoi leggere di pi\u00f9 a riguardo qui, ma il succo \u00e8 il seguente:<\/p>\n<blockquote>\n<p>Questo hook di azione viene eseguito appena prima che WordPress determini quale pagina del modello caricare. \u00c8 un buon hook da utilizzare se \u00e8 necessario eseguire un reindirizzamento con piena conoscenza del contenuto che \u00e8 stato interrogato.<\/p>\n<\/blockquote>\n<p>E, per essere chiari, non sto dissuadendo l&#8217;uso di questo gancio. Sto solo offrendo un&#8217;alternativa. E questo \u00e8 questo (poich\u00e9 dovrebbe funzionare come segue):<\/p>\n<ol>\n<li>attivare il plugin,<\/li>\n<li>individuare il tema attivo,<\/li>\n<li>se non esistono gi\u00e0, copia i file modello dal plug-in nella directory principale del tema attivo<\/li>\n<\/ol>\n<p>Il passaggio finale \u00e8 fondamentale perch\u00e9 se i file modello esistono, \u00e8 importante non sovrascriverli principalmente perch\u00e9 l&#8217;utente potrebbe aver scritto le proprie personalizzazioni.<\/p>\n<p>Detto questo, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ecco come puoi farlo in un&#8217;unica funzione<\/a><\/strong> (completa di commenti per mostrare cosa stai usando).<\/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>Nota che questo utilizza diverse funzioni PHP. Vale a dire:<\/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\">fetta_array<\/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\">scandir<\/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\">il file esiste<\/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\">copia<\/a><\/strong><\/li>\n<\/ul>\n<p>Tutto ci\u00f2 che penso sia utile e importante da sapere indipendentemente dalla natura in cui li stai usando.<\/p>\n<h2>Gli host lo supportano?<\/h2>\n<p>Alcuni host lo fanno. So per certo che host come <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEngine<\/a><\/strong> non lo fanno e questa non \u00e8 nemmeno una critica all&#8217;host. Alcuni lo fanno per motivi di sicurezza; altri lo consentono, ma ci\u00f2 non significa che siano meno sicuri, significa solo che la loro infrastruttura \u00e8 configurata in modo diverso.<\/p>\n<p>In definitiva, questo dimostra che ci sono altri modi per rendere disponibili i modelli agli utenti quando viene utilizzato un plug-in, ma non \u00e8 l&#8217;unico modo e potrebbe non funzionare sempre.<\/p>\n<p>Tuttavia, avere opzioni \u00e8 positivo, soprattutto se preferisci un&#8217;architettura specifica nel tuo plug-in rispetto a un&#8217;altra.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte di registrazione:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si tratta di creare modelli personalizzati per i plugin, voglio che funzionino ed ecco un&#8217;alternativa alla funzione template_redirect di WordPress.<\/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":[896,804,720,865],"tags":[1168],"class_list":["post-231193","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codice","category-php-6","category-sviluppatore","category-wordpress-6","tag-affiai-it"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/comments?post=231193"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/posts\/231193\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/media?parent=231193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/categories?post=231193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/it\/wp-json\/wp\/v2\/tags?post=231193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}