Muchas veces encontramos un plugin que hace casi lo que queremos. Hoy veremos que, en algunos casos, podemos modificar ese plugin para que haga exactamente lo que buscamos sin tener que modificar su código fuente.
Para que esto sea posible el plugin original debe hacer un buen uso de los hooks («ganchos») de WordPress: acciones (código a ejecutar en momentos específicos de la ejecución de WordPress) y filtros (modificaciones de los datos antes/después de llamar a una acción). Más sobre hooks, actions y filters.
La idea básica es que podemos modificar el comportamiento del plugin a extender escribiendo nuestros propios hooks personalizados para complementar / modificar los del plugin original. Veámos esta idea en acción con un ejemplo:
Éste será nuestro plugin principal, lo que hace el plugin es crear una lista con los últimos 5 posts después del contenido del post.
extensible-plugin.php
Ver código extensible-plugin.php
Para llevar esto a cabo, el plugin principal va a implementar hooks personalizados, concretamente vamos a crear un filtro que nos permitirá modificar los parámetros de WP_Query. Fijaros que para obtener los últimos 5 posts llamamos a WP_Query con un array de argumentos $args:
$args = array( 'post_type' => 'post', 'post_status' => 'publish', 'post__not_in' => array( $id ), 'posts_per_page' => 5 );
$the_query = new WP_Query( apply_filters( 'ep_args', $args ) );
pero en lugar de añadir directamente $args a WP_Query, lo que hacemos es añadir $args como valor a nuestro hook ep_args
. Esto hace esta parte del código extensible como veremos en seguida.
También vamos a crear dos acciones para añadir contenido antes y después del contenido que imprime el plugin principal gracias a las siguientes dos acciones:
do_action( 'ep_before_list' ); do_action( 'ep_after_list' );
A continuación vamos a ver cómo podemos usar nuestros hooks personalizados desde otro plugin para modificar este comportamiento. El código del segundo plugin es:
addon-extensible-plugin.php
addon-extensible-plugin.php
Ver código addon-extensible-plugin.php
que a diferencia del plugin original va a mostrar 10 posts en lugar de 5 y va a mostrar contenido antes y después de la lista.
Filtro ep_args
Para modificar los argumentos de WP_Query conectando el filtro ep_args
del plugin principal con la función custom_ep_args
:
Dentro de la función custom_ep_args
podemos modificar todos los argumentos de WP_Query, por ejemplo $args['posts_per_page'] = 10;
.
Acción ep_before_list
Para añadir contenido antes de los resultados utilizamos la acción ep_before_list
definida por el plugin original y la enlazamos con la función custom_ep_before_list
:
Acción ep_after_list
De forma similar, para añadir contenido después de los resultados utilizamos la acción ep_after_list
y la añadimos a la función custom_ep_after_list
:
Parámetros
Para simplicar, en los ejemplos anteriores no hemos utilizado parámetros en nuestros hooks, a continuación veremos cómo añadirlos en una acción.
Creamos por ejempo una acción con 3 parámetros:
do_action( 'mi_accion', $param1, $param2, $param3 );
A continuación vemos cómo utilizarla:
add_action( 'mi_accion', 'mi_funcion', 10, 3 ); function mi_funcion( $param1, $param2, $param3 ) { … }
10 es el parámetro priority, podemos utilizarlo para organizar el orden de ejecución.
3 es el total de parámetros que acepta la acción.
Conclusión
Espero que os haya gustado el minitutorial, he utilizado ejemplos simples pero creo que os pueden servir como base para aplicarlos en vuestros futuros Plugins.
Hay que señalar que todos los conceptos de este tutorial son igualmente aplicables a Themes, es decir que podeis crear vuestros hooks personalizados en vuestros Themes también.
Hola Emili, enhorabuena por el post, muy útil y muy bien explicado. ¿Sabes si hay alguna forma de meterle mano a un plugin si no utiliza do_action ni apply_filter?
Saludos!
Hola Manuel, gracias, la verdad es que soy nuevo en esto de escribir artículos, Jordi Cabot me hechó una mano para hacerlo más entendedor 🙂
Siempre puedes modificar la funcionalidad de un plugin creando tu própio código pero no es la manera más óptima de hacerlo. Yo cuando busco un plugin es lo primero que miro, si es extensible con hooks porque al final siempre vas a tener que ajustar algo.
Si tienes que modificar funcionalidad y el plugin no implementa hooks para poder hacerlo yo te recomendaría crear el código fuera del plugin original, sea en un plugin o en el functions.php del theme por ejemplo, de esta manera podrás actualizar el plugin original sin problemas. También es importante que pongas condicionales en tu código function_exists o class_exists (si el plugin original utiliza clases), de esta manera te aseguras que tu código se va a ejecutar solo si la función o clase existe o si el plugin está activado.
Buenos días Emili, ¿conoces alguna forma de «hacer un plugin hijo» es decir hacer lo mismo que con los temas hijos pero con un plugin?
Gracias
Buenos días,
Permíteme que te responda en nombre de nuestro amigo y compañero Emili 😉 Básicamente, no es posible crear un plugin hijo tal y como lo hacemos con los temas. Veamos por qué.
Como imagino que ya sabes, los temas en WordPress funcionan a través de un sistema de plantillas. Existen un conjunto de ficheros predefinido que todo tema debería implementar (algunos son obligatorios, otros recomendables) y WordPress selecciona un fichero u otro en función de una jerarquía que viene predefinida. Por ejemplo, para decidir cómo mostrar una página cualquiera, WordPress intentará cargar alguno de los siguientes ficheros (en este orden):
page-{slug}.php
page-{id}.php
page.php
index.php
Puedes leer en la documentación.
Cualquiera de estos ficheros es susceptible de ser «sobrescrito» en un tema hijo. Cuando defines un tema hijo, WordPress buscará cada uno de esos ficheros en ambos temas: primero en el hijo y luego en el padre, de tal forma que la alternativa más específica disponible se muestre.
En el caso de los plugins, no obstante, esto no es posible. Cuando WordPress lee y carga un plugin, todos los métodos y clases que tiene definidos van apareciendo en la memoria de PHP, con lo cual no es posible que un plugin hijo sobrescriba nada de un plugin padre. Aunque existen fórmulas para permitir que un plugin sobrescriba cosas de otro (usando cosas como
function_exists
), la forma correcta de hacerlo es usando el mecanismo de filtros y acciones de WordPress. La idea es sencilla: el plugin «padre» define uno o más puntos de extensión a los que los plugins «hijo» se pueden enganchar y, así, modificar el comportamiento original.A todo esto, ¿qué estás intentando hacer? ¿Qué problema intentas resolver?
¡Un saludo!
Buenas tardes cambie a https y no me aparece el candado, le puse inspeccionar en Chrome y me dice que hay que cambiar la referencia en el archivo index, pero lo veo y no tiene ninguna referencia a mi sitio, por favor asesorenme realmente no se que hacer
Saludos
Habla con tu proveedor de hosting, Francisco, ya que cada uno de ellos gestiona los certificados «a su manera».
Un saludo,
David