{"id":230360,"date":"2022-12-04T13:05:00","date_gmt":"2022-12-04T10:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230360"},"modified":"2022-11-09T22:00:49","modified_gmt":"2022-11-09T19:00:49","slug":"usando-el-patron-de-registro-en-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/usando-el-patron-de-registro-en-wordpress\/","title":{"rendered":"Usando el patr\u00f3n de registro en WordPress"},"content":{"rendered":"\n<p>He tenido algunas conversaciones con varios amigos y otras personas en Twitter sobre la noci\u00f3n de variables globales en lenguajes de programaci\u00f3n. Para aquellos que son nuevos en la programaci\u00f3n o que no est\u00e1n seguros de por qu\u00e9 son malos:<\/p>\n<blockquote>\n<p>El uso de variables globales hace que el software sea m\u00e1s dif\u00edcil de leer y comprender. Dado que cualquier c\u00f3digo en cualquier parte del programa puede cambiar el valor de la variable en cualquier momento, comprender el uso de la variable puede implicar comprender una gran parte del programa.<\/p>\n<\/blockquote>\n<p>Esto no quiere decir <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Global_variable\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">que no tengan su uso<\/a><\/strong>, pero si est\u00e1 interesado en la programaci\u00f3n orientada a objetos (especialmente en una configuraci\u00f3n de WordPress donde usar\u00e1 PHP), entonces es importante comprender algunas alternativas mejores. que las variables globales.<\/p>\n<p>Es decir, hay formas de trabajar pasando datos por la aplicaci\u00f3n sin necesidad de variables globales. Y una de esas formas es el patr\u00f3n de registro.<\/p>\n<h2>El patr\u00f3n de registro en WordPress<\/h2>\n<p>Primero, tenga en cuenta que los patrones de dise\u00f1o trascienden cualquier patr\u00f3n en particular. Siempre que un lenguaje ofrezca los conceptos de objetos (o incluso abstracciones), entonces es posible implementar el patr\u00f3n.<\/p>\n<p>Pero, \u00bfpor qu\u00e9 molestarse en usar esto?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163107-61e74a43bb7bf.jpg\" 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-163107-61e74a43bb7bf.jpg\" alt=\"Usando el patr\u00f3n de registro en WordPress\" ><\/a><\/p>\n<p>Foto de Samuel Zeller en Unsplash<\/p>\n<p>En resumen, proporciona una forma orientada a objetos de pasar informaci\u00f3n alrededor de su aplicaci\u00f3n sin necesidad de variables globales. Cosas como <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">los contenedores de inyecci\u00f3n de dependencia<\/a><\/strong> tambi\u00e9n son buenos para esto, pero est\u00e1n m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n. Tambi\u00e9n dir\u00eda que hay momentos en los que pueden ser excesivos en el contexto de peque\u00f1os complementos.<\/p>\n<h3>Implementando el Patr\u00f3n<\/h3>\n<p>Dicho esto, \u00bfc\u00f3mo podemos implementar el patr\u00f3n de registro en WordPress y luego aprovecharlo a lo largo de nuestro trabajo? Echemos un vistazo a <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-00-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la estructura b\u00e1sica del patr\u00f3n,<\/a><\/strong> primero:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Serves as a registry for all objects that need to be accessed globally throughout the\n * plugin.\n *\/\nclass Registry\n{\n\n  \/**\n   * @var array The array used to the the various objects that will be used in the plugin.\n   *\/\n  private $storage;\n\n  \/**\n   * Initializes the plugin by creating an instance of an empty array.\n   *\/\n  public function __construct()\n  {\n      $this-&gt;storage = [];\n  }\n\n  \/**\n   * Adds an instance of a class to the registry's storage array using the given key\n   *\n   * @param string $id    The ID of the object to be used to retrieve it later in the plugin.\n   * @param mixed  $class An instance of the class that will be associated with the specified key.\n   *\/\n  public function add($id, $class)\n  {\n      $this-&gt;storage[$id] = $class;\n  }\n\n  \/**\n   * @param string $id    The ID of the object to retrieve from the repository.\n   * @return mixed $class An instance of the class associated with the specified key (or null if it doesn't exist).\n   *\/\n  public function get($id)\n  {\n      return array_key_exists($id, $this-&gt;storage)? $this-&gt;storage[$id]: null;\n  }\n}<\/code><\/pre>\n<p>Observe que su implementaci\u00f3n es bastante simple:<\/p>\n<ol>\n<li>La clase contiene una \u00fanica matriz como propiedad privada.<\/li>\n<li>Los datos se agregan a la matriz con una identificaci\u00f3n espec\u00edfica.<\/li>\n<li>Los datos se pueden recuperar del patr\u00f3n con el ID.<\/li>\n<\/ol>\n<p>Incluso podr\u00eda llevar este patr\u00f3n en particular al siguiente nivel si acepta solo una clase de cierto tipo (como un AbstractEvent, por ejemplo) y luego invoca autom\u00e1ticamente una funci\u00f3n en la clase cada vez que se pasa (o se recupera) del registro.<\/p>\n<p>Pero eso es entrar en una implementaci\u00f3n m\u00e1s compleja que me gustar\u00eda para esta publicaci\u00f3n.<\/p>\n<h3>Configuraci\u00f3n del Registro<\/h3>\n<p>Debido a la naturaleza del sistema de enlace de WordPress, hay una forma particular en la que el Registro debe configurarse y luego registrarse con WordPress.<\/p>\n<p>Digamos que est\u00e1s trabajando con un complemento. Dentro del archivo de arranque del complemento, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-01-register-repository-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">haga algo como esto:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Creates a Registry using the Registry Design Pattern to store objects\n * that can be used throughout the plugin.\n *\n *\/\n$registry = new Registry();\nadd_filter('acmeRegistry', function() use ($registry) {\n  return $registry;\n});<\/code><\/pre>\n<p>Esto crea el registro y luego crea un filtro correspondiente que podemos usar m\u00e1s adelante en el complemento para recuperar el registro y, por lo tanto, otros objetos que mantiene.<\/p>\n<h3>Uso del Registro<\/h3>\n<p>Para agregar un objeto al registro, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-02-adding-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">llame a la funci\u00f3n de agregar y pase una identificaci\u00f3n \u00fanica y una instancia del objeto<\/a><\/strong>. Tenga en cuenta que nuestra implementaci\u00f3n actual eliminar\u00e1 cualquier instancia anterior de un objeto que tenga la misma clave y la reemplazar\u00e1 con lo que le pasemos.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository and add an instance of a \n * PostManager to it. The PostManager is a class that allows us\n * to manipulate posts.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());<\/code><\/pre>\n<p>Desde all\u00ed, puede <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2f9f0c09dd21c2b8214a787686d778c6#file-03-using-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">recuperar los objetos<\/a><\/strong> que almacen\u00f3 en el registro:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Get an reference to the repository, get a reference to the PostManager\n * then you can begin working with it.\n *\/\n$this-&gt;registry = apply_filters('acmeRegistry', null);\n$this-&gt;registry-&gt;add('postManager', new PostManager());\n\n\/\/ An example call that you can make to set the title of the post.\n$postManager-&gt;updateTitle('This Is the New Title');\n<\/code><\/pre>\n<p>Y puedes usarlos como lo har\u00eda oyu de cualquier otra manera. Pero esto evita la necesidad de usar singletons, variables globales u otras cosas peligrosas.<\/p>\n<h2>Una palabra sobre la capacidad de prueba<\/h2>\n<p>Otra ventaja que encuentro con la implementaci\u00f3n de este patr\u00f3n es que no solo te permite escribir m\u00e1s f\u00e1cilmente pruebas unitarias contra \u00e9l, sino que tambi\u00e9n te da la capacidad de escribir pruebas contra los objetos que puede contener.<\/p>\n<p>Con eso quiero decir que puede escribir sus clases de manera m\u00e1s independiente de WordPress, separando as\u00ed la l\u00f3gica del dominio de la aplicaci\u00f3n central y haci\u00e9ndolas m\u00e1s representativas de los datos que se supone que deben mantener.<\/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 formas de trabajar con el paso de datos alrededor de su aplicaci\u00f3n sin necesidad de variables globales. Y una de esas formas es el patr\u00f3n de registro.<\/p>\n","protected":false},"author":1,"featured_media":163108,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,840,861],"tags":[1172],"class_list":["post-230360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230360","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=230360"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230360\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/163108"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}