{"id":231144,"date":"2022-12-23T11:06:00","date_gmt":"2022-12-23T08:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231144"},"modified":"2022-12-07T10:47:51","modified_gmt":"2022-12-07T07:47:51","slug":"incluir-plantillas-personalizadas-en-nuestros-complementos-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/incluir-plantillas-personalizadas-en-nuestros-complementos-de-wordpress\/","title":{"rendered":"Incluir plantillas personalizadas en nuestros complementos de WordPress"},"content":{"rendered":"\n<p>Creo que uno de los aspectos m\u00e1s subestimados, o quiz\u00e1s uno de los aspectos raramente discutidos del desarrollo de complementos personalizados, es la capacidad de incluir plantillas personalizadas en nuestros complementos de WordPress.<\/p>\n<p>Y, para ser honesto, lo entiendo: soy bastante firme en lo que deber\u00eda ser un complemento y lo que deber\u00eda ser un tema.<\/p>\n<p>Eso es:<\/p>\n<ul>\n<li>los temas son para presentaci\u00f3n,<\/li>\n<li>Los complementos son funcionalidad.<\/li>\n<\/ul>\n<p>Si incluyo plantillas en un complemento, \u00bfno estoy haciendo lo mismo que cuando los desarrolladores incluyen funcionalidad en sus temas?<\/p>\n<p>Como con tantas cosas en desarrollo, creo que depende. Quiero decir, agregar muchas funciones que te encierran en un tema es algo de lo que no soy fan\u00e1tico. Del mismo modo, si tiene un complemento destinado a mostrar datos en el front-end y es independiente del tema, entonces tiene sentido.<\/p>\n<p>As\u00ed que tienes que ser juicioso en tus decisiones.<\/p>\n<p>Independientemente, hay un conjunto com\u00fan de pasos que podemos usar al incluir plantillas personalizadas en nuestros complementos de WordPress.<\/p>\n<p>Y eso es lo que esta publicaci\u00f3n va a mostrar.<\/p>\n<p>Si va a incluir plantillas personalizadas en el complemento, supondr\u00e9 que est\u00e1 utilizando plantillas \u00fanicas y de archivo. De lo contrario, use solo los ganchos y el c\u00f3digo a continuaci\u00f3n que necesita.<\/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=\"Incluir plantillas personalizadas en nuestros complementos de WordPress\" ><\/a><\/p>\n<p>Para ambos, sin embargo, sepa esto:<\/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\">plantilla_\u00fanica<\/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\">archivo_plantilla<\/a><\/li>\n<\/ul>\n<p>Usando estos ganchos, puede decirle a WordPress d\u00f3nde residen las plantillas personalizadas en su complemento.<\/p>\n<h3>Organizaci\u00f3n de plantillas<\/h3>\n<p>Para m\u00ed, generalmente tengo un\u00a0 directorio de <strong>plantillas<\/strong> en mi complemento que ubica al mismo nivel que los\u00a0 directorios de <strong>activos, src<\/strong> y <strong>proveedor<\/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=\"Incluir plantillas personalizadas en nuestros complementos de WordPress\" ><\/a><\/p>\n<p>Esto facilita saber d\u00f3nde residen y proporciona una forma consistente de incluirlos en todos los complementos que cre\u00f3. Despu\u00e9s de todo, hay algo que decir para ser consistente en las convenciones que usamos.<\/p>\n<h3>Incluyendo las Plantillas<\/h3>\n<p>Suponiendo que tiene\u00a0 una plantilla <strong>single-acme.php<\/strong> y una plantilla <strong>archive-acme.php<\/strong>, es f\u00e1cil incluirla. Y aunque soy m\u00e1s fan\u00e1tico del uso de la programaci\u00f3n orientada a objetos, mostrar\u00e9 c\u00f3mo incluir estas plantillas usando c\u00f3digo de procedimiento.<\/p>\n<p>Si lo desea, es f\u00e1cil convertir este c\u00f3digo en c\u00f3digo orientado a objetos. Adem\u00e1s, voy a suponer que tambi\u00e9n incluyes esto para los tipos de publicaciones personalizadas.<\/p>\n<p>Siempre puede omitir un condicional para un tipo de publicaci\u00f3n personalizada si desea simplemente incluir estas plantillas pero, en mi experiencia, encuentro raro que estas situaciones no usen tipos de publicaci\u00f3n personalizada, pero no conozco su situaci\u00f3n.<\/p>\n<p>Dicho esto, aqu\u00ed est\u00e1 el c\u00f3digo.<\/p>\n<h4>Definici\u00f3n de ganchos<\/h4>\n<p>Primero, necesitamos definir los ganchos. Esto es relativamente simple ya que vamos a usar los ganchos descritos anteriormente.<\/p>\n<p>Primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-02-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la plantilla \u00fanica<\/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>Y luego <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-03-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la plantilla de archivo<\/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>Y ahora podemos implementar el c\u00f3digo para cada una de las funciones.<\/p>\n<h4>Agregar el c\u00f3digo<\/h4>\n<p>Entonces, primero, veremos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-00-acme-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la plantilla \u00fanica<\/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>Y ahora <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-01-acme-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la plantilla de archivo<\/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 ha prestado mucha atenci\u00f3n al c\u00f3digo, sabe que hay muy pocas cosas diferentes. De hecho, el proceso general se puede resumir de la siguiente manera:<\/p>\n<ol>\n<li>definir el gancho,<\/li>\n<li>localizar la plantilla,<\/li>\n<li>verifique el tipo de publicaci\u00f3n personalizada,<\/li>\n<li>la plantilla existe, util\u00edzala<\/li>\n<li>de lo contrario, use la plantilla predeterminada<\/li>\n<\/ol>\n<p>Y este es el proceso para las plantillas individuales y de archivo.<\/p>\n<h3>Escritura de plantillas compatibles<\/h3>\n<p>Y finalmente, y esto es importante especialmente si desea que la plantilla sea lo m\u00e1s agn\u00f3stica posible, trato de usar tantas etiquetas de plantilla de WordPress integradas como sea posible cuando muestre el contenido relacionado con el complemento. Esto permite a los desarrolladores de temas dise\u00f1arlo f\u00e1cilmente para que encaje con su tema.<\/p>\n<p>No, no podr\u00e1 acomodar todos los temas, pero esa es la naturaleza de los temas de WordPress. El punto es tomar tanto trabajo de recuperaci\u00f3n y representaci\u00f3n de datos de la plantilla como sea posible para que los desarrolladores front-end puedan administrarlos f\u00e1cilmente.<\/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>Hay un conjunto com\u00fan de pasos que podemos usar al incluir plantillas personalizadas en nuestros complementos de 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":[892,716,831,800,840,861],"tags":[1172],"class_list":["post-231144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-guia-para-principiantes","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231144","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=231144"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231144\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/236054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}