Escribir widgets de WordPress mantenibles Parte 2 de 2

En la primera publicación de esta serie, discutimos las razones por las que los complementos de WordPress deben tratarse más como proyectos de software más grandes (pero a menudo no lo son) y defendimos el uso de código bien organizado para intentar que nuestros proyectos de complementos sean más fáciles de mantener. . Todo esto se realizó dentro del contexto de desarrollo de un widget de WordPress.


La cuestión es que los widgets no son el único tipo de complementos que se pueden desarrollar para WordPress. La aplicación también admite complementos que amplían su funcionalidad mediante el uso de ganchos ubicados en toda la aplicación. Como tal, los widgets no son el único tipo de complemento que podría beneficiarse de un repetitivo.

En este tutorial, definiremos qué son exactamente los ganchos de WordPress, cómo funcionan y por qué son beneficiosos. A continuación, echaremos un vistazo a mi WordPress Widget Boilerplate y cómo aprovecharla en nuevos proyectos a través del contexto de una aplicación de ejemplo.


Comprensión de ganchos, acciones y filtros

Antes de desarrollar complementos, es importante entender el modelo de WordPress para engancharse en la aplicación y las diferentes acciones y filtros..

  • Los ganchos son áreas en la aplicación principal de WordPress que le permiten registrar su código para su ejecución. En pocas palabras, su complemento se registra con WordPress en un punto específico de ejecución. Cuando WordPress alcanza ese punto de ejecución (ya sea guardando información, representando información o algún otro punto), dispara su código.
  • Las acciones son un tipo de gancho que WordPress pone a su disposición para que aproveche cada vez que ocurra un evento específico durante el ciclo de vida de la aplicación. Algunos de estos puntos incluyen cada vez que se activa un tema, cada vez que se guarda una publicación o cada vez que se representan las hojas de estilo. En general, si está buscando insertar algún tipo de funcionalidad personalizada en cualquier momento del ciclo de vida de WordPress, es probable que haya un gancho de acción disponible..
  • Los filtros son un tipo de enlace que WordPress pone a su disposición para que pueda manipular los datos antes de enviarlos a la base de datos o enviarlos para que se procesen en el navegador. En pocas palabras, WordPress pasará el contenido a su función y luego continuará con su proceso con lo que devuelva. Si desea manipular los datos antes de guardarlos o verlos, su mejor opción es usar el filtro.

Bastante fácil, ¿verdad? Además de eso, WordPress tiene documentación sólida para agregar acciones [1] y agregar filtros [2]. Puede obtener más información sobre los complementos en la API de complementos [3] en el Códice de WordPress [4].


Un plugin repetitivo

Si leyó el artículo anterior, entonces ya está familiarizado con la API de widgets. Es preciso porque requiere un constructor y no menos de tres funciones para que algo funcione. Debido a que los complementos tienen la flexibilidad de conectarse a una variedad de puntos en el proceso de WordPress, la API del complemento es un poco menos estructurada. Afortunadamente, esto no significa que no podamos crear algún tipo de repetitivo para crear nuestros complementos..

Después de todo, todavía consisten en alguna funcionalidad común:

  • Código del plugin del núcleo
  • Hojas de estilo
  • JavaScript
  • Archivos de localización
  • Margen
  • Imágenes

Similar a nuestro WordPress Widget Boilerplate, podemos configurar nuestro directorio de plantillas para que se vea así:

Parece familiar, ¿no? El aspecto más importante del Plugin Boilerplate no son los detalles de la estructura del directorio (aunque examinaremos un poco en el futuro), sino la organización del código del complemento principal..

El esqueleto de plugin

Plugin puede desarrollarse mediante el uso de un puñado de funciones o envolviendo cada función en una clase en un enfoque orientado a objetos. Soy un fanático de este último y mi repetitivo lo representa. Aquí está la definición del plugin:

 init_plugin_constants (); load_plugin_textdomain (PLUGIN_LOCALE, false, dirname (plugin_basename (__ FILE__)). '/ lang'); / * * TODO: * Define la funcionalidad personalizada para su complemento. El primer parámetro de las llamadas * add_action / add_filter son los ganchos en los que debe dispararse su código. * * El segundo parámetro es el nombre de la función ubicado dentro de esta clase. Vea los apéndices * más adelante en el archivo. * * Para obtener más información: * http://codex.wordpress.org/Plugin_API#Hooks.2C_Actions_and_Filters * / add_action ('TODO', array ($ this, 'action_method_name')); add_filter ('TODO', array ($ this, 'filter_method_name'));  // end if // end constructor / * -------------------------------------- ------* * Funciones básicas *--------------------------------------- ------ * / / ** * Nota: Las acciones son puntos en la ejecución de una página o proceso * ciclo de vida que WordPress dispara. * / function action_method_name () // TODO define su método de acción aquí // fin de action_method_name / ** * Nota: Los filtros son puntos de ejecución en los que WordPress modifica los datos * antes de guardarlos o enviarlos al navegador. * / function filter_method_name () // TODO define su método de filtro aquí // fin de filter_method_name / * ---------------------------- ---------------- * * Funciones privadas * ----------------------------- ---------------- * / / ** * Inicializa las constantes utilizadas por conveniencia en * el complemento. * / private function init_plugin_constants () / * TODO * * Esto proporciona el identificador único para su complemento utilizado en * la localización de las cadenas utilizadas en todo. * * Por ejemplo: wordpress-widget-boilerplate-locale. * / if (! defined ('PLUGIN_LOCALE')) define ('PLUGIN_LOCALE', 'plugin-name-locale');  // termina si / * TODO * * Define esto como el nombre de tu complemento. Esto es lo que se muestra * en el área de Widgets de WordPress. * * Por ejemplo: WordPress Widget Boilerplate. * / if (! definido ('PLUGIN_NAME')) define ('PLUGIN_NAME', 'Nombre del complemento');  // termina si / * TODO * * esta es la bala de tu complemento que se usa para inicializarlo con * la API de WordPress. * Este también debe ser el directorio * en el que reside su complemento. Usa guiones. * * Por ejemplo: wordpress-widget-boilerplate * / if (! Defined ('PLUGIN_SLUG')) define ('PLUGIN_SLUG', 'plugin-name-slug');  // end if // end init_plugin_constants / ** * Función de ayuda para registrar y cargar scripts y estilos. * * @name La ID para registrarse con WordPress * @file_path La ruta al archivo real * @is_script Argumento opcional para si la ruta_archivo entrante es un archivo fuente de JavaScript. * / private function load_file ($ name, $ file_path, $ is_script = false) $ url = WP_PLUGIN_URL. $ file_path; $ archivo = WP_PLUGIN_DIR. $ file_path; if (file_exists ($ file)) if ($ is_script) wp_register_script ($ name, $ url); wp_enqueue_script ($ name);  else wp_register_style ($ name, $ url); wp_enqueue_style ($ nombre);  // end if // end if // end _load_file // end class // TODO: actualice la llamada de creación de instancias de su complemento al nombre dado en la definición de clase new TODO (); ?>

La mayoría de los IDE tienen una función que enumera todos los TODO pendientes, por lo que los coloco en todo el código para localizar fácilmente lo que se necesita hacer durante el desarrollo. Tenga en cuenta que hay tres áreas principales de código:

  1. Constructor. Esta función es responsable de definir las constantes utilizadas en todo el código, de especificar los archivos de localización y de registrar todas las acciones y filtros con WordPress..
  2. Las funciones básicas son las definiciones de funciones reales registradas en el constructor que se activan después durante la ejecución de WordPress.
  3. Las Funciones de ayuda hacen referencia a las funciones que utilizo que ayudan en la ejecución al abstraer funciones comunes (como el registro de JavaScripts y hojas de estilo).

Tenga en cuenta que el desarrollo de complementos se desvía del desarrollo de widgets, ya que no se esperan múltiples funciones. De hecho, solo necesitas un constructor. A partir de ahí, cualquier función definida dentro de las llamadas add_action o add_filter y su responsabilidad de implementar.

¿Tener sentido? Echemos un vistazo al uso de esta placa de caldera en un ejemplo simple.


Un ejemplo de trabajo con el feed RSS de tu blog

WordPress ofrece ganchos para casi el punto de ejecución que pueda imaginar. En este ejemplo, nos conectaremos al proceso de representación posterior para introducir un mensaje personalizado. La cuestión es que solo queremos mostrar dicho mensaje en el contexto de un lector RSS..

Primero, los requisitos:

  • Muestra un mensaje al pie de cada publicación.
  • El mensaje solo debe aparecer en lectores RSS.
  • El mensaje debe contener un enlace al sitio web de la publicación.

En base a esto, no parece que tengamos que usar ningún JavaScript, CSS o marca para crear nuestro complemento, por lo que podemos reducir nuestro complemento al código del complemento principal y los archivos de localización:

En este punto, podemos comenzar a apagar la placa de calderas con un nombre y las constantes del complemento:

 / ** * Inicializa las constantes utilizadas por conveniencia en * el complemento. * / función privada init_plugin_constants () if (! defined ('PLUGIN_LOCALE')) define ('PLUGIN_LOCALE', 'rss-note-locale');  // terminar si if (! definido ('PLUGIN_NAME')) define ('PLUGIN_NAME', 'RSS Note');  // termina si if (! definido ('PLUGIN_SLUG')) define ('PLUGIN_SLUG', 'rss-note-slug');  // end if // end init_plugin_constants

A continuación, debemos considerar qué tipo de enlace se requiere para manipular el contenido. Recuerde que estamos intentando agregar algo a la dirección de contenido para representarlo en el navegador, necesitaremos un filtro. A partir de aquí, podemos aplastar al constructor:

 / ** * Inicializa el complemento configurando las funciones de localización, filtros y administración. * / function __construct () // Define constnats utilizados en el complemento $ this-> init_plugin_constants (); load_plugin_textdomain (PLUGIN_LOCALE, false, dirname (plugin_basename (__ FILE__)). '/ lang'); // agregar la nota tanto al extracto como a la fuente principal add_filter ('the_content', array ($ this, 'display_rss_note')); add_filter ('the_excerpt_rss', array ($ this, 'display_rss_note'));  // constructor final

Tenga en cuenta que la función utiliza dos filtros: uno para the_content [5] y otro para the_excerpt_rss [6]. Estamos haciendo esto porque algunos usuarios optan por publicar solo un extracto de su blog en lugar de todo el contenido y queremos asegurarnos de que estamos capturando ambos casos.

A continuación, implementemos la definición de función que agregará el mensaje al resto de la publicación:

 / ** * Agrega un breve mensaje al pie de cada publicación que se ve en un lector de RSS * recordando a los usuarios que visiten su sitio. * / public function display_rss_note ($ content) if (is_feed ()) $ content. = '
'; $ contenido. = '

'; $ content. = __ ('Gracias por leer! Asegúrate de ponerte al día con el resto de mis publicaciones en', PLUGIN_LOCALE); $ content. = ''; $ content. = get_bloginfo ('nombre'); $ content. = '!'; $ contenido. = '

'; $ contenido. = '
'; // termina si devuelve $ contenido; // fin de display_rss_note

Tenga en cuenta que la función acepta un parámetro al que hace referencia la variable $ content. WordPress en sí está pasando estos datos a la función. Para estos filtros en particular, nos ocupamos del contenido de una publicación de blog, por lo que todo lo que le agregamos debe concatenarse para que se agregue al final de la misma..

Este mensaje que estamos agregando simplemente dice "¡Gracias por leer! ¡Asegúrese de ponerse al día con el resto de mis publicaciones en [Nombre del blog]!" ¿A través del uso de la función get_bloginfo () [7]? Por supuesto, puedes actualizarlo para leer lo que quieras. Finalmente, tenga en cuenta que hemos envuelto esto en un condicional que verifica la función is_feed () [8]. Esto es importante ya que solo queremos que este código se active si el contenido se envía a través de un canal RSS.

Eso es todo, no está mal, ¿verdad? Puede descargar la versión completa del código fuente de trabajo (incluido el README asociado) para este complemento en GitHub o aquí mismo desde Wptuts. El repetitivo también está disponible en GitHub, también..

El objetivo de esta serie era no solo ayudar a proporcionar una guía introductoria a la API del complemento de WordPress, sino también proporcionar un caso y refuerzos para facilitar el tratamiento y el mantenimiento de los complementos de WordPress como cualquier otro proyecto de software.

  1. http://codex.wordpress.org/Function_Reference/add_action
  2. http://codex.wordpress.org/Function_Reference/add_filter
  3. http://codex.wordpress.org/Plugin_API
  4. http://codex.wordpress.org/Main_Page
  5. http://codex.wordpress.org/Function_Reference/the_content
  6. http://codex.wordpress.org/Template_Tags/the_excerpt_rss
  7. http://codex.wordpress.org/Function_Reference/is_feed
  8. http://codex.wordpress.org/Function_Reference/get_bloginfo