{"id":229902,"date":"2022-11-23T15:35:00","date_gmt":"2022-11-23T12:35:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229902"},"modified":"2022-11-09T19:13:17","modified_gmt":"2022-11-09T16:13:17","slug":"trabajar-con-clases-plantillas-y-parciales-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/trabajar-con-clases-plantillas-y-parciales-en-wordpress\/","title":{"rendered":"Trabajar con clases, plantillas y parciales en WordPress"},"content":{"rendered":"\n<p>Cuando me sent\u00e9 para comenzar esta publicaci\u00f3n, plane\u00e9 escribir algo mucho m\u00e1s complicado de lo que voy a compartir. Inicialmente, quer\u00eda caminar a trav\u00e9s de una de dos cosas:<\/p>\n<ul>\n<li>La gu\u00eda completa para configurar un entorno de desarrollo,<\/li>\n<li>Integraci\u00f3n de herramientas de calidad de c\u00f3digo en PhpStorm<\/li>\n<\/ul>\n<p>El primero ser\u00eda centrarse en una variedad de otras cosas de las que he hablado, unirlas todas y tener una referencia definitiva. Pero esto es algo en lo que quiero tomarme el tiempo de armar para asegurarme de que se haga bien.<\/p>\n<p>El segundo es uno que creo que es importante, pero estoy en una fase de transici\u00f3n con algunas de mis propias herramientas. Hasta que eso est\u00e9 hecho, prefiero no escribir sobre eso.<\/p>\n<p>A\u00fan as\u00ed, siempre hay algo que cubrir, \u00bfverdad? As\u00ed que hoy opt\u00e9 por algo m\u00e1s simple: desglosar el uso de clases, plantillas y parciales en los complementos de WordPress usando un ejemplo simple.<\/p>\n<h2>Clases, plantillas y parciales en WordPress<\/h2>\n<p>Para este tema en particular, una pregunta inmediata que puede surgir es simple: \u00bfPor qu\u00e9 molestarse en hablar de esto?<\/p>\n<p>Porque estamos en 2018 y seguimos viendo una gran combinaci\u00f3n de PHP, CSS, marcado y JavaScript en un solo archivo. Esto no es para tocar otras tecnolog\u00edas que hacen esto de manera predeterminada (como React). Me refiero espec\u00edficamente a los complementos de WordPress y a escribir c\u00f3digo mantenible de tal manera que sea [obviamente] f\u00e1cil de mantener, escribir y leer.<\/p>\n<h3>Un ejemplo pr\u00e1ctico<\/h3>\n<p>Supongamos que est\u00e1 trabajando en una p\u00e1gina de submen\u00fa para algo que aparecer\u00e1 en un men\u00fa personalizado. <a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-00-addmenupage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Registras tu p\u00e1gina<\/a> usando la API de WordPress:<\/p>\n<pre><code>&lt;?php\n\npublic function addMenuPage()\n{\n    add_menu_page(\n      'Acme Menu',\n      'Acme Menu',\n      'manage_options',\n      'acme-custom-menu',\n      array($this, 'display'),\n      'dashicons-dashboard',\n      30\n    );\n\n    add_submenu_page(\n      'acme-custom-menu',\n      'Acme Menu',\n      'Acme Menu',\n      'Acme Menu',\n      'acme-custom-menu',\n      array($this, 'display')\n    );\n}\n<\/code><\/pre>\n<p>Pero cuando configura una funci\u00f3n de devoluci\u00f3n de llamada para mostrar la p\u00e1gina, <strong>no<\/strong> usa la funci\u00f3n para mezclar todos los idiomas. En su lugar, lo usa para <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-01-display-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">incluir un archivo.<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function display()\n{\n    include_once $this-&gt;pluginPath. 'views\/acme-settings.php';\n}\n<\/code><\/pre>\n<p>Tenga en cuenta que en el archivo anterior, hago referencia a una propiedad <strong>$this-&gt;pluginPath<\/strong>. Esto se establece en el constructor de la clase para que pueda acceder f\u00e1cilmente a la ra\u00edz del complemento.<\/p>\n<p>De todos modos, \u00bfc\u00f3mo podr\u00eda ser este archivo?<\/p>\n<h3>Una plantilla y un parcial<\/h3>\n<p>En este caso, asumo que su plantilla es lo que proporcionar\u00e1 informaci\u00f3n al usuario y solicitar\u00e1 su entrada. El parcial ser\u00e1 responsable de mostrar un mensaje de \u00e9xito, error o advertencia al usuario.<\/p>\n<h4>Una plantilla<\/h4>\n<p>Para simplificar, mantendr\u00e9 la plantilla y el parcial lo m\u00e1s reducidos posible. En este caso, suponga que vamos a mostrar una p\u00e1gina, le pediremos al usuario que guarde un valor y, si el valor se guarda correctamente (y, por lo tanto, existe en la tabla <strong>wp_options<\/strong> ), mostraremos el mensaje de \u00e9xito.<\/p>\n<p>Esto significa:<\/p>\n<ul>\n<li>la plantilla mostrar\u00e1 el t\u00edtulo de la p\u00e1gina, la informaci\u00f3n, la entrada y el bot\u00f3n Guardar,<\/li>\n<li>el parcial mostrar\u00e1 el mensaje de \u00e9xito cuando sea necesario.<\/li>\n<\/ul>\n<p>Eche un vistazo al c\u00f3digo de <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-02-acme-settings-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la plantilla a continuaci\u00f3n:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the settings page for the plugin.\n *\/\n?&gt;\n&lt;div class=\"wrap\"&gt;\n    &lt;h1 class=\"wp-heading-inline\"&gt;&lt;?php echo get_admin_page_title(); ?&gt;&lt;\/h1&gt;\n    &lt;?php if ($this-&gt;showSuccessMessage()) { ?&gt;\n      &lt;?php include_once 'partials\/settings-saved.php'; ?&gt;\n    ?&gt;\n    &lt;div id=\"acme-settings-schedule\"&gt;\n        &lt;form id=\"acme-form\" method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"\"&gt;\n            &lt;!-- This is where your settings go. --&gt;\n            &lt;p&gt;\n                &lt;?php\n                submit_button(\n                    'Save',\n                    'primary',\n                    'acme-save-settings',\n                    false\n                );\n                wp_nonce_field(\n                    'acme-save',\n                    'acme-save-nonce'\n                );\n                ?&gt;\n            &lt;\/p&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Tenga en cuenta que, s\u00ed, tiene una entrada, un bot\u00f3n para guardar y un nonce, todos los cuales son importantes (pero m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n) para guardar informaci\u00f3n.<\/p>\n<p>Pero tambi\u00e9n tenga en cuenta que tiene una funci\u00f3n de ayuda que uso para verificar la presencia de informaci\u00f3n guardada con \u00e9xito. Esta funci\u00f3n reside en la misma clase responsable de representar la plantilla.<\/p>\n<h4>Parcial<\/h4>\n<p>Se ve algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-03-showsuccessmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">como esto:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\npublic function showSuccessMessage()\n{\n  return (false !== get_option('acme_custom_setting'));\n}\n<\/code><\/pre>\n<p>Y el parcial resultante es <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/f72e1444fb01cff19de2c58f0aacab34#file-04-settings-saved-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">muy simple:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * Renders the success message if the option has been properly saved.\n *\/\n?&gt;\n\n&lt;div class=\"notice-success notice is-dismissible\"&gt;\n    &lt;p&gt;Your settings have been successfully saved.&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Por supuesto, su implementaci\u00f3n de la funci\u00f3n puede variar. El prop\u00f3sito no es tanto mostrar c\u00f3mo implementar la funci\u00f3n sino c\u00f3mo aprovechar una funci\u00f3n para verificar informaci\u00f3n para mostrar un parcial.<\/p>\n<h2>Hay m\u00e1s (pero no aqu\u00ed)<\/h2>\n<p>Tal vez esto es algo que deber\u00eda colocarse al principio del art\u00edculo.<\/p>\n<p>Para ser honesto, creo que es una de esas cosas en las que a algunos les puede resultar m\u00e1s \u00fatil verlo desde el principio (pero luego les falta el contexto del c\u00f3digo) y a otros les resulta m\u00e1s \u00fatil al final porque pueden ver c\u00f3mo encaja todo. juntos.<\/p>\n<p>De todos modos, espero que, en \u00faltima instancia, brinde claridad sobre c\u00f3mo encaja todo esto.<\/p>\n<p>Adem\u00e1s, hay mucho espacio en lugares para personalizar cosas como:<\/p>\n<ul>\n<li>comprobando para asegurarse de que el usuario tiene permiso para guardar,<\/li>\n<li>verificando el valor nonce,<\/li>\n<li>sanear y validar los datos,<\/li>\n<li>determinar qu\u00e9 constituye \u00e9xito, advertencias y errores.<\/li>\n<\/ul>\n<p>Pero si debo cubrir todo lo anterior, estamos viendo una publicaci\u00f3n extraordinariamente larga o una larga serie de publicaciones. No es algo contra lo que est\u00e9 en contra, pero tambi\u00e9n es algo contra lo que no creo que valga la pena el esfuerzo en este momento.<\/p>\n<p>Nunca dude en ofrecer comentarios. Pero mientras tanto, espero que todo esto te ayude a tener una base sobre la cual construir cuando trabajes en tu pr\u00f3ximo proyecto.<\/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>En esta publicaci\u00f3n, analizo el uso de clases, plantillas y parciales en los complementos de WordPress usando un ejemplo simple.<\/p>\n","protected":false},"author":1,"featured_media":164763,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[716,800,840,861],"tags":[1172],"class_list":["post-229902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229902","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=229902"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229902\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164763"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}