Como soy un desarrollador de WordPress, muchas personas se han preguntado “¿Dónde debo agregar WordPress Hooks?” Sí, esta es una señal de que necesito más amigos que no sean desarrolladores de WordPress, pero este no es el propósito de este artículo. Por supuesto, no hay una respuesta correcta. Aunque al final, la respuesta depende de una variedad de cosas, quiero compartir algunos modelos diferentes y discutir los pros y los contras de cada uno. Dicho esto, creo que estas discusiones pierden un punto importante: los complementos de WordPress API-alias Hooks: es una API que debemos tener cuidado de conectar nuestro código.
Escribir el código desconectado por las API con las que interactúa es una parte importante de escribir un buen código. Al mismo tiempo, los complementos de WordPress, o la API de Hooks, son tan esenciales para la forma en que funciona WordPress, desacoplar la API del complemento no siempre es práctico. Pero sigue siendo un objetivo importante. Puede que no siempre sea posible, pero se satisfará más tarde cuando necesite escribir pruebas o reutilizar la lógica de una llamada de gancho. Entonces, veamos algunos lugares para agregar un gancho y las ventajas y desventajas de esas ubicaciones. Nos centraremos en cuán fuerte o débil se acople este código y por qué puede o no ser un problema.
En el constructor, cuando la mayoría de nosotros aprendemos a usar OOP PHP en un contexto de WordPress, en general, aprendemos a poner ganchos en el constructor de clases. Los constructores de clase son métodos mágicos que se ejecutan cuando la clase se instancia. Este modelo conduce a agregar ganchos mágicamente. Aquí hay una implementación bastante típica de este modelo: <? Php
Clase Term_Control_1 {
/**
* Crear objeto
*/
Función pública __construct () {
add_action ('rescue_post', [$ this, 'save_post'], 10);
}
/**
* Cuando se actualiza la publicación, verifique si tiene la categoría 7 o no y agregue o elimine el campo personalizado
*
* @param $ ID
*/
Función pública save_post ($ id) {
Remove_action ('rescue_post', [$ this, 'save_post');
if (! vacía ($ _post ['post_category') && in_array (7, $ _post ['post_category)) {
update_post_meta ($ id, '_fancy_cats', 1);
}de lo contrario{
delete_post_meta ($ id, '_fancy_cats', 1);
}
}
}
Nuevo Term_Control_1 (); En este código, declaramos una clase que determinará la función de ejecución en el reverso save_post. En Save_Post, verificamos si una determinada categoría se establece en la publicación y actualizamos un campo personalizado sobre la base de ella. Para garantizar que este código se esté ejecutando, nos clasificamos instantáneamente en la parte inferior del archivo.
Esto funciona por completo, pero está muy fuertemente combinado con un súper global y, por lo tanto, con una solicitud HTTP, así como con la API del complemento. ¿Qué sucede si queremos ejecutar este código en otro lugar usando una identificación de publicación arbitraria? Para hacer esto, debemos crear otra instancia de la clase, que se puede lograr. También debemos cambiar después del superglobal, lo cual es posible, pero desordenado. ¿Cómo probaría esto? Deberíamos superar la solicitud HTTP recibida y la API del complemento. Esto se puede lograr, verifique WP_MOCK, pero me gustaría probar todo aislado.
Este enfoque funciona, pero tiene problemas. Tampoco podemos eliminar el gancho, lo que podría ser un problema. Además, esta clase lo instaló en cada solicitud, lo cual es un desperdicio. Un punto menor cuando miramos un archivo, pero si este modelo se repite, se puede agregar. Agregar el gancho con una función El uso de una función para administrar ganchos es necesario cuando se usa clases, pero también es excelente para un enfoque de diseño orientado al objeto. La función de llamada inversa, una función se usa solo para administrar la traducción de un contexto específico a la dependencia apropiada que la clase necesita. Esto permite que la clase actúe como una actualización del sistema basada en categorías, en cualquier contexto y la función de ser un Conector a la API del complemento.
Esta clase no tiene interacción con la API de los complementos o la solicitud HTTP actual. Esta no es su preocupación. La preocupación de esta clase es la lógica del sistema, no interactuando con otras API. Este es un ejemplo práctico de los beneficios de respetar el principio de separación. Esta clase no le preocupa cómo recibe sus entradas, sino solo lo que hace con sus entradas. Todavía necesitamos una conexión a esas entradas, los datos posteriores y la API de los complementos. Entonces tendremos que tener una función para eso:
update_categories ();
}
} Esta función solo trata de conectar esta clase al mundo exterior. Como una hermosa ventaja, eliminar este gancho ahora es muy fácil. Más importante aún, podemos reutilizar la clase en cualquier publicación, con cualquier gama de categorías. Podríamos extender esta clase para cambiar el campo o la categoría, o incluso usarlos para agregar o eliminar métodos de campo separados de la lógica interna. Ahora podemos separar la lógica de la clase, así como la función de gancho y devolución de llamada. Utilizando métodos estáticos, puede tener una clase con métodos estáticos que traten con llamadas inversas para sus azadas. Esta estrategia tiene muchos de los mismos beneficios que hemos cubierto antes, pero también le brinda los beneficios organizativos de usar las clases para estructurar su código. Este ejemplo va de una función a una clase con métodos estáticos para hacer lo mismo: update_categories ();
}
}
} En este momento, esto no es necesariamente mejor. Probablemente sea con algunos nanosegundos más lentos y no tenga beneficios reales. Pero con un ligero cambio, puede volverse un poco más útil.
Cambiemos la acción que usamos en “Admin_int” y la usemos para llamar a un método “add_hooks” en esta clase: <? Php
add_action ('admin_init', ['termin_control_hoks', 'admin_hooks');

Clase Term_Control_Hooks {
Función pública pública admin_hooks () {
add_action (‘rescue_post’, [__class__, ‘rescue_post’], 10, 2);}
Save_post static público function ($ id, $ post) {
if (! vacía ($ _ post [‘post_category’])) {
$ categorías = $ _post [‘post_category’];
$ control = new Termin_Control_2 ($ post, $ categorías);
$ control-> update_categories ();
}
}
} En este ejemplo, hace lo mismo, pero si tenemos otras partes del sistema tenemos que ejecutar en otros ganchos de administración, podemos hacerlo sin otros cambios importantes.
update_categories ();
}
}
Publicidad pública de función load_scripts () {
}
} Ahora los cambios realizados a nuestra clase para agregar nuevos ganchos solo necesitan un nuevo método y un add_action () o add_fitler (). Me gusta esto, porque mantendrá esta clase como una capa para conectarse a la API del complemento, mientras mantiene la lógica fuera de esta clase de conexión.
Ganchos en la clase A menudo pongo ganchos en la misma clase con su lógica. Todavía está fuertemente acoplado, pero a veces vale la pena mantener el código asociado juntos. A veces, las ventajas de la legibilidad son más importantes que otras preocupaciones. Pero, todavía no me gusta usar el constructor, porque esto le da al constructor la segunda preocupación además de configurar la condición. Aquí hay un ejemplo en el que la clase para adjuntar un mensaje de urgencia a una publicación utilizando el filtro “The_Content”. Esta clase tiene métodos separados para agregar y eliminar el gancho, así como la devolución de llamada real: call_to_action = $ call_to_action;
}
/**
* Agregar el filtro
*/
Función pública add_hook () {
add_filter (‘the_content’, [$ this, ‘filter_content’);
}
/**
* Retire el filtro
*/
Función pública remove_hook () {
Remove_filter (‘the_content’, [$ this, ‘filter_content’);
}
/**
* Agregar CTA para publicar contenido
*
* @param cadena $ contenido
*
* @return cadena
*/
Función pública filter_content ($ content) {
Devuelve $ contenido. $ this-> call_to_action;
}
} Cada método de esta clase tiene una preocupación.En este sentido, respetamos el principio de responsabilidad única, de acuerdo con la definición de que cada función o clase debe tener un trabajo.Pero, de acuerdo con la misma definición, la clase no lo es, porque esta clase tiene dos tareas: la interacción con la API de los complementos y la adición al contenido de una publicación.Me gusta este diseño.Mantiene todo el sistema en una unidad.El sistema se puede reutilizar en un contexto diferente.No debemos usar el filtro con él.Echa un vistazo a este ejemplo: post_content = $ appender-> filter_content ($ post-> post_content);
wp_update_post ($ post);
}
Gross ahora usamos el mismo código para aplicar el mismo cambio en el guardar la publicación. Este ejemplo muestra cómo esta clase podría sobrevivir completamente desconectada de la API del complemento. Según Tom McFarlin, pensar en el principio de responsabilidad única como “una clase y cada uno de sus métodos debería tener una sola tarea”. En cambio, dice que deberíamos pensarlo haciendo la pregunta “” Si esta clase cambiara, ¿qué debería cambiarse? ” Si la pregunta tiene varias respuestas, entonces se ha violado el principio de responsabilidad única. Hacer esta pregunta en esta clase nos da una sola respuesta. Estos principios de diseño de software no se tratan de aplicar reglas arbitrarias. Se tratan de crear un código fácil de trabajo y fácil de restaurar. Su búsqueda hace para sistemas más estables que no requieren factores importantes para hacer un cambio donde no hay más lugares donde pueda agregar ganchos. Por ejemplo, su proyecto puede requerir un sistema de gestión de gancho más robusto. Pero me detendré aquí, porque el propósito de este artículo era hacerle pensar en las consecuencias de sus decisiones de diseño cuando se trata de la API de complementos. Pensar en sus decisiones en términos de flexibilidad, probabilidad y restauración conduce a un mejor código. Es una forma práctica de pensar sobre los principios de responsabilidad única y la separación de las preocupaciones en términos prácticos. Como la mayoría de las preguntas. No puedo darte una respuesta si me preguntas “¿dónde poner mis ganchos?
¿Dónde deberías poner ganchos de WordPress?Depende
Tags ¿Dónde deberías poner ganchos de WordPress?Depende
homefinance blog