{"id":228539,"date":"2022-10-22T10:10:00","date_gmt":"2022-10-22T07:10:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228539"},"modified":"2022-11-09T02:55:02","modified_gmt":"2022-11-08T23:55:02","slug":"detener-la-ejecucion-del-complemento-sin-una-dependencia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/detener-la-ejecucion-del-complemento-sin-una-dependencia\/","title":{"rendered":"Detener la ejecuci\u00f3n del complemento sin una dependencia"},"content":{"rendered":"\n<p>Si aborda gran parte del desarrollo de complementos de WordPress desde una perspectiva orientada a objetos, eventualmente llegar\u00e1 a un punto en el que no tendr\u00e1 mucha interacci\u00f3n directamente con el n\u00facleo de WordPress.<\/p>\n<p>Y, en mi opini\u00f3n, eso es algo bueno. Es una se\u00f1al de una arquitectura que est\u00e1 estructurando correctamente su c\u00f3digo. Eso es:<\/p>\n<ol>\n<li>Tienes WordPress sentado en el nivel fundamental,<\/li>\n<li>Tiene un conjunto de clases que se encuentran justo encima de WordPress responsables de enviar informaci\u00f3n hacia y desde WordPress entre el complemento,<\/li>\n<li>Y tiene el resto de su c\u00f3digo que comprende el resto de la funcionalidad.<\/li>\n<\/ol>\n<p>La forma en que esto se implementa puede variar, pero la forma general en que imagino esto es la misma forma en que tiendo a pensar en la aplicaci\u00f3n est\u00e1ndar <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de N niveles<\/a> donde tiene la capa de datos, la capa de aplicaci\u00f3n y el front-end.<\/p>\n<p>Excepto por esta vez, tiene WordPress, una capa para comunicarse con WordPress y el resto de su c\u00f3digo y, ya sabe, el resto de su c\u00f3digo.<\/p>\n<p>C\u00f3mo se puede organizar un complemento.<\/p>\n<p>Entonces, \u00bfqu\u00e9 sucede cuando desea detener la ejecuci\u00f3n del complemento cuando tiene que interactuar con una dependencia de terceros y solo debe ejecutarse si esa dependencia est\u00e1 presente?<\/p>\n<h2>Detener la ejecuci\u00f3n del complemento<\/h2>\n<p>Debido a la naturaleza de PHP y WordPress, hay algunas formas de hacerlo. El c\u00f3digo que voy a compartir no prescribe la forma de hacerlo.<\/p>\n<p>En cambio, esta es una forma de hacerlo (que se extrajo de algo que est\u00e1 en desarrollo). Adem\u00e1s, tambi\u00e9n mostrar\u00e9 c\u00f3mo interact\u00faa con algunos otros componentes de los complementos.<\/p>\n<h3>1 El Constructor<\/h3>\n<p>Si lee suficientes art\u00edculos sobre WordPress y la programaci\u00f3n orientada a objetos, es probable que descubra que los constructores no deben usarse para definir ganchos. Y estoy de acuerdo.<\/p>\n<p>Crea un nivel innecesario de acoplamiento y hace que las pruebas sean m\u00e1s dif\u00edciles. Entonces, \u00bfcu\u00e1l es el prop\u00f3sito de un constructor en c\u00f3digo basado en WordPress?<\/p>\n<p>Lo uso por las mismas razones que esperar\u00eda en cualquier otro idioma: para inicializar las propiedades de la clase. En el siguiente c\u00f3digo, ver\u00e1s tres cosas:<\/p>\n<ol>\n<li>Inicializo una propiedad,<\/li>\n<li>Verifico si existe una dependencia de terceros,<\/li>\n<li>Si no es as\u00ed, agrego un mensaje de error,<\/li>\n<li>Actualizo la propiedad.<\/li>\n<\/ol>\n<p>Claro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">es detallado<\/a>, pero tampoco recurre a un c\u00f3digo inteligente para inicializar valores.<\/p>\n<pre><code>&lt;?php\n\npublic function __construct( $container) {\n\n    $this-&gt;can_run = true;\n\n    \/\/ If the dependency isn't installed, then add a message and flag execution to stop.\n    $this-&gt;messenger = $container-&gt;get( 'settings-messenger');\n    if (! class_exists( 'Acme_Dependency')) {\n\n        $this-&gt;messenger-&gt;add_error_message( 'The dependency is not installed.' );\n        $this-&gt;can_run = false;\n    }\n}\n<\/code><\/pre>\n<p>(A medida que envejezco, m\u00e1s me gusta el c\u00f3digo espec\u00edfico, ya que hace que sea m\u00e1s f\u00e1cil de leer, aprender y seguir adelante a un ritmo m\u00e1s r\u00e1pido que la alternativa).<\/p>\n<h3>2 El m\u00e9todo de inicializaci\u00f3n<\/h3>\n<p>Dado que no estamos usando un constructor para trabajar con ganchos de WordPress, esta funcionalidad deber\u00eda existir dentro del contexto de otro m\u00e9todo.<\/p>\n<p>Esto nos brinda un lugar dedicado para colocar este tipo de funcionalidad, desacoplarla del resto de la clase y hacer que interact\u00fae con WordPress solo cuando el m\u00e9todo se invoque expl\u00edcitamente.<\/p>\n<p>Pero recuerde, el objetivo principal de lo que quiero decir tiene que ver con detener la ejecuci\u00f3n de un complemento, no con d\u00f3nde colocar los ganchos.<\/p>\n<p>Entonces, digamos que la dependencia de terceros no existe, \u00bfentonces qu\u00e9? Recuerde en el constructor, se estableci\u00f3 una propiedad que nos permitir\u00e1 determinar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">si debemos avanzar<\/a> con la configuraci\u00f3n de ganchos o no:<\/p>\n<pre><code>&lt;?php\n\npublic function init() {\n\n    if (! $this-&gt;can_run) {\n        return;\n    }\n\n    add_action( 'admin_notices', array( $this, 'admin_notices') );\n}\n<\/code><\/pre>\n<p>Y cuando eso est\u00e9 en su lugar, el resto del c\u00f3digo no se ejecutar\u00e1.<\/p>\n<h2>Muchas palabras, un poco de c\u00f3digo<\/h2>\n<p>Suena como una gran explicaci\u00f3n para tan poco c\u00f3digo.<\/p>\n<p>Pero una parte de esto tambi\u00e9n es para tratar de transmitir la importancia de tener partes de un proyecto basado en WordPress separadas del resto del n\u00facleo para que las partes puedan interactuar entre s\u00ed sin necesidad expl\u00edcita de hablar con el n\u00facleo todo el tiempo.<\/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>\u00bfQu\u00e9 sucede cuando desea detener la ejecuci\u00f3n del complemento cuando tiene que funcionar con una dependencia de terceros y solo debe hacerlo si est\u00e1 presente?<\/p>\n","protected":false},"author":1,"featured_media":221144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,914,800,861],"tags":[1172],"class_list":["post-228539","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-otro","category-php-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228539","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=228539"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228539\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}