Extender un plugin de WordPress sin tocar su código fuente – Ejemplo

Publicada en WordPress.

Mira nuestro vídeo

Existe una versión mejor de tu web

Comparte este artículo

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
plugins_extensibles_01

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.
plugins_extensibles_02

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:

Ver código 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:

Ver código 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:

Ver código 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.

6 comentarios en «Extender un plugin de WordPress sin tocar su código fuente – Ejemplo»

  1. 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!

    1. 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.

  2. 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

    1. 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):

      1. Page Template. La plantilla concreta que hayas asignado a una página, desde el editor de páginas.
      2. page-{slug}.php
      3. page-{id}.php
      4. page.php
      5. 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!

  3. 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

    1. Habla con tu proveedor de hosting, Francisco, ya que cada uno de ellos gestiona los certificados «a su manera».

      Un saludo,
      David

Deja una respuesta

No publicaremos tu correo electrónico. Los campos obligatorios están marcados con: •

He leído y acepto la Política de privacidad de Nelio Software

Al marcar la casilla de aceptación estás dando tu legítimo consentimiento para que tu información personal se almacene en SiteGround y sea usada por Nelio Software con el propósito único de publicar aquí este comentario. Contáctanos para corregir, limitar, eliminar o acceder a tu información.