{"id":230616,"date":"2022-12-10T14:14:00","date_gmt":"2022-12-10T11:14:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230616"},"modified":"2022-12-07T12:07:34","modified_gmt":"2022-12-07T09:07:34","slug":"una-alternativa-al-gancho-template_redirect-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/una-alternativa-al-gancho-template_redirect-de-wordpress\/","title":{"rendered":"Una alternativa al gancho template_redirect de WordPress"},"content":{"rendered":"\n<p>La mayor\u00eda del trabajo que hago en este momento se enfoca en complementos personalizados o utilidades que funcionan sobre WordPress.<\/p>\n<p>Si tuviera que conceptualizar cu\u00e1ntos de los proyectos que construyo est\u00e1n juntos, revisar\u00eda WordPress (y todo lo que implica) como base, y luego el c\u00f3digo tiene una capa que se comunica con WordPress, y que puede comunicarse con API de terceros.<\/p>\n<p>Sin embargo, al hacer esto, a menudo hay un componente frontal que requiere que represente la informaci\u00f3n en plantillas. Aunque la creaci\u00f3n de plantillas para WordPress no es intr\u00ednsecamente dif\u00edcil (aunque desear\u00eda que tuvi\u00e9ramos algo m\u00e1s que etiquetas de plantilla, como un motor de plantillas, esa es otra publicaci\u00f3n), creo que vale la pena ver un par de formas en que podemos manejar plantillas que empaquetamos con complementos.<\/p>\n<p>Sin embargo, una de las primeras preguntas que suele surgir con esta declaraci\u00f3n es<\/p>\n<blockquote>\n<p>\u00bfPor qu\u00e9 incluir\u00eda plantillas personalizadas en un complemento?<\/p>\n<\/blockquote>\n<p>Y lo entiendo en algunos niveles.<\/p>\n<ol>\n<li>Mantener las plantillas en un complemento difumina un poco las l\u00edneas entre temas y complementos, especialmente cuando deja temas para presentaci\u00f3n y complementos para l\u00f3gica comercial.<\/li>\n<li>Pedir a los usuarios que copien archivos de temas de una ubicaci\u00f3n a otra es una mala experiencia para el usuario.<\/li>\n<\/ol>\n<p>Pero hay algunas refutaciones o quiz\u00e1s excepciones absolutas a los casos anteriores.<\/p>\n<h2>Gancho de WordPress template_redirect<\/h2>\n<p>Antes de hablar sobre el gancho <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a> de WordPress, quiero hablar un poco sobre los puntos mencionados anteriormente.<\/p>\n<h3>1 Plantillas en Complementos<\/h3>\n<p>Si est\u00e1 creando un complemento personalizado que interact\u00faa tanto con WordPress como con una API de terceros o que usa alg\u00fan tipo de combinaci\u00f3n de repositorios, f\u00e1bricas, modelos y vistas, entonces necesitar\u00e1 mostrar esta informaci\u00f3n en el frente. -end, y debe ser independiente del tema.<\/p>\n<p>Esto no significa que alguien no pueda dise\u00f1ar los elementos de la p\u00e1gina o incluir la plantilla en su trabajo, pero s\u00ed significa que el complemento debe proporcionar un nivel b\u00e1sico de informaci\u00f3n que se presenta al usuario.<\/p>\n<h3>2 Pedir a los usuarios que copien archivos es malo<\/h3>\n<p>\u00bfRecuerdas el eslogan que Apple sol\u00eda promocionar como \u00bb <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\">simplemente funciona?<\/a><\/strong> &quot; Aunque puede que no sea algo que digan tanto como antes (si es que lo hacen, ya), me gusta la idea de que &quot;simplemente funcione&quot; para el usuario, y es algo por lo que trato de esforzarme en mi trabajar.<\/p>\n<p>Entonces, cuando se trata de crear plantillas personalizadas o vistas para complementos, no quiero pedirle al usuario que tenga que copiar archivos. Solo quiero que ellos:<\/p>\n<ol>\n<li>instalar el complemento,<\/li>\n<li>haga clic en activar.<\/li>\n<\/ol>\n<p>Y eso es. El resto debe ser evidente o estar bien documentado.<\/p>\n<h2>De vuelta al gancho<\/h2>\n<p>De acuerdo, supongamos por un momento que hemos creado un complemento, el complemento incluye varias plantillas b\u00e1sicas (o vistas seg\u00fan la jerga que use) y que las plantillas deben escribirse en la ra\u00edz del directorio del tema activo.<\/p>\n<p>Puede usar el gancho <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> (y muchos complementos populares lo hacen). Puede leer m\u00e1s sobre esto aqu\u00ed, pero la esencia es la siguiente:<\/p>\n<blockquote>\n<p>Este enlace de acci\u00f3n se ejecuta justo antes de que WordPress determine qu\u00e9 p\u00e1gina de plantilla cargar. Es un buen enlace para usar si necesita hacer una redirecci\u00f3n con pleno conocimiento del contenido que se ha consultado.<\/p>\n<\/blockquote>\n<p>Y, para ser claros, no estoy disuadiendo el uso de este gancho. Solo ofrezco una alternativa. Y eso es esto (ya que deber\u00eda funcionar de la siguiente manera):<\/p>\n<ol>\n<li>activar el complemento,<\/li>\n<li>localizar el tema activo,<\/li>\n<li>si a\u00fan no existen, copie los archivos de plantilla del complemento al directorio ra\u00edz del tema activo<\/li>\n<\/ol>\n<p>El paso final es fundamental porque si los archivos de plantilla existen, entonces es importante no sobrescribirlos principalmente porque el usuario podr\u00eda haber escrito sus personalizaciones.<\/p>\n<p>Dicho esto, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed es como puede hacerlo en una sola funci\u00f3n<\/a><\/strong> (completa con comentarios para mostrar lo que est\u00e1 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>Tenga en cuenta que esto utiliza varias funciones de PHP. A saber:<\/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\">escandir<\/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\">El archivo 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\">Copiar<\/a><\/strong><\/li>\n<\/ul>\n<p>Todos los cuales creo que son \u00fatiles e importantes para saber, independientemente de la naturaleza en la que los est\u00e9 utilizando.<\/p>\n<h2>\u00bfLos anfitriones admiten esto?<\/h2>\n<p>Algunos anfitriones lo hacen. S\u00e9 con certeza que los hosts como <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEngine<\/a><\/strong> no lo hacen y esto tampoco es una cr\u00edtica del host. Algunos lo hacen por razones de seguridad; otros lo permiten, pero eso no significa que sean menos seguros, solo significa que tienen su infraestructura configurada de manera diferente.<\/p>\n<p>En \u00faltima instancia, esto demuestra que hay otras formas de hacer que las plantillas est\u00e9n disponibles para los usuarios cuando se usa un complemento, pero no es la \u00fanica forma y es posible que no siempre funcione.<\/p>\n<p>Sin embargo, tener opciones es bueno, especialmente si prefiere una arquitectura espec\u00edfica en su complemento sobre otra.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuando se trata de crear plantillas personalizadas para complementos, quiero que simplemente funcionen y aqu\u00ed hay una alternativa a la funci\u00f3n template_redirect de 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":[892,716,800,861],"tags":[1172],"class_list":["post-230616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230616"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230616\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}