✅ Noticias, temas, complementos de WEB y WordPress. Aquí compartimos consejos y las mejores soluciones para sitios web.

Registro de ganchos de WordPress usando otra clase

16

En la publicación de ayer, hablé sobre los constructores de complementos de WordPress y la razón de por qué los ganchos no deberían estar en el constructor.

Aunque mencioné varias formas de manejar el registro de anzuelos, no me molesté en entrar en detalles para cada una de esas estrategias. En lo que a mí respecta, merecen su propio artículo para proporcionar tantos detalles como sea posible sobre cómo configurar algo.

Por ejemplo, uno de los métodos que compartí decía:

  • Es posible crear una clase que mantenga un registro de objetos y los ganchos con WordPress.

En otras palabras, se trata de registrar ganchos de WordPress utilizando un enfoque orientado a objetos para disminuir el acoplamiento y aumentar la cohesión entre los componentes del complemento.

Pero, ¿qué significa eso? ¿Cuáles son las ventajas que trae, cómo se configura y cómo se usa?

Registro de ganchos de WordPress

Si está leyendo esto, es probable que esté familiarizado con el sistema de enlace de WordPress, el orden en que se activan y cómo una función o clase puede registrar sus funciones con WordPress para que puedan realizar cualquier trabajo que necesiten manejar.

Y a menudo vemos clases haciendo esto por su cuenta. Dependiendo del proyecto, lo hago yo mismo. Para aquellos que no están familiarizados, generalmente se ve así :

<?php

add_action( 'plugins_loaded', 'acme_start' );
/**
 * Start the machine.
 * https://www.youtube.com/watch?v=ysoMOefPyRs
 */
function acme_start() {
    $plugin = new AcmeColumn();
}

Pero todo esto se puede dividir en clases más cohesivas para, en última instancia, darles a las clases aún menos responsabilidad (algo bueno) y disminuir el acoplamiento entre una clase o un conjunto de clases con WordPress.

Un ejemplo de un diseño que desglosaré en esta publicación.

Sin embargo, la naturaleza contraria a la intuición de esto es que requerirá al menos otra clase. Pero así es como funciona.

Configurándolo

Para los propósitos de este ejemplo, solo usaremos una clase simple que registrará algún tipo de acción con WordPress. La idea de la arquitectura funciona así:

  1. Está la clase principal que tiene la función que queremos vincular a WordPress.
  2. Hay una clase responsable de orquestar el enlace de la función de la clase a WordPress.

Bastante fácil, ¿verdad? Pero aquí está el problema: la clase responsable de registrar las funciones de una clase determinada con WordPress es el punto que requiere una decisión de diseño.

Primero, llamemos a la clase HookRegistry para que podamos referirnos a ella correctamente. A continuación, llamemos a la clase con las funciones que queremos vincular a AcmeColumn simplemente para representar una clase que agrega una nueva columna al tablero de la página en el área de administración de WordPress.

Con eso en su lugar, la decisión de diseño se reduce a esto:

  1. ¿Debe HookRegistery saber acerca de AcmeColumn?
  2. ¿Debe AcmeColumn conocer el HookRegistry?

Sé que hay otras formas de organizar esto y también hay estrategias sobre cómo manejar esto (como la inversión de control) y estos son temas que vale la pena explorar, pero para mantener esta idea inicial lo más clara posible, la presentaré para una publicación futura.

usando la clase

Dadas las opciones anteriores, pasaremos una instancia de AcmeColumn a HookRegistry cuando las clases se instancian durante el proceso inicial de inicio del complemento de WordPress. Esto puede parecerse a esto :

<?php

add_action( 'plugins_loaded', 'acme_start' );
/**
 * Start the machine.
 * https://www.youtube.com/watch?v=ysoMOefPyRs
 */
function acme_start() {

  $registry    = new HookRegistry();

  $acme_column = new AcmeColumn( $registry );
  $acme_column->start();
}

Luego, siempre que sea el momento de que AcmeColumn  registre su función con WordPress, llamaremos a HookRegistry y le indicaremos que lo haga.

Primero, AcmeColumn :

<?php

class AcmeColumn {

    private $registry;

    public function __construct( $registry) {
        $this->registry = $registry;
    }

    public function start() {
        $registry->add_hook( 'filter', 'manage_edit-page_columns', $this, 'add_page_column' );
    }

    public function add_page_column( $page_columns) {

        $page_columns['template'] = 'Acme Column';
        return $page_columns;
    } 
}

Entonces el HookRegistry :

<?php

class HookRegistry {

  public add_hook( $type, $name, $object, $method) {

    $type = strtolower( $type );
    if ('filter' !== $type || 'action' !== $type) {
      return new WP_Error( '1', 'No proper hook type defined.' );
    }
  }

  private function add_filter( $name, $object, $method) {
    add_filter( $name, array( $object, $method) );
  }

  private function add_action( $name, $object, $method) {
    add_action( $name, array( $object, $method) );
  }
}

Opcionalmente, también podemos mantener una lista de las distintas clases y ganchos que se han registrado. Esto puede o no ser útil según su implementación, por lo que lo comparto simplemente como "aquí hay algo que quizás desee hacer".

Y eso podría verse así (usando una matriz asociativa simple):

<?php

class HookRegistry {

  private $registry;

  public function __construct() {
    $this->registery = array(); 
  }

  public add_hook( $id, $type, $name, $object, $method) {

    $type = strtolower( $type );
    if ('filter' !== $type || 'action' !== $type) {
      return new WP_Error( '1', 'No proper hook type defined.' );
    }

    if ('filter' === $type) {
      $this->add_filter( $name, $object, $method );
    } else {
      $this->add_action( $name, $object, $method );
    }

    $hook_info = array(
      $type,
      $name,
      $object,
      $method,
    );
    $this->registry[ $id ] = $hook_info;
  }

  private function add_filter( $name, $object, $method) {
    add_filter( $name, array( $object, $method) );
  }

  private function add_action( $name, $object, $method) {
    add_action( $name, array( $object, $method) );
  }
}

Observe que en la clase anterior, ahora acepta un $id como parámetro. Hay varias formas de identificar la información que ingresa en un registro, la más fácil de las cuales es crear la identificación usted mismo.

Sin embargo, si quisiera usar algo como el nombre del enlace o el nombre de la clase, eso también funcionaría. Solo tenga en cuenta que, dado que es una matriz asociativa, solo puede mantener un valor único por clave, por lo que puede terminar desechando los datos anteriores si no tiene cuidado.

Independientemente, esto es algo que considero opcional, pero si se implementa, es importante asegurarse de tener las funciones adecuadas para recuperar una instancia del objeto mediante una clave.

Uno de tantos

Al igual que con todo lo relacionado con este tipo de trabajo, es posible rediseñarlo o reorientarlo de una manera que funcione de manera diferente o que se adapte a sus necesidades. El propósito no es mostrar el patrón definitivo de cómo hacer algo, sino una forma de abordarlo y adaptarlo (al igual que cualquier patrón de diseño).

Además, está destinado a asegurarse de que nuestras clases mantengan las responsabilidades para las que fueron creadas al mismo tiempo que les permite registrarse en WordPress según sea necesario. Esta vez, sin embargo, la clase no tiene que hacerlo por sí misma.

En cambio, pasa la responsabilidad a una clase que tiene la responsabilidad exclusiva de registrar dichos ganchos. Entonces, aunque introduce más clases, aumenta la cohesión y disminuye el acoplamiento.

Esto ofrece beneficios en el mantenimiento, las pruebas y el diseño general.

Fuente de grabación: tommcfarlin.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More