Dos formas de desarrollar complementos de WordPress programación orientada a objetos

Cuando se trata de escribir complementos de WordPress, generalmente hay dos formas de hacerlo: Programación orientada a objetos y Programación funcional (con los widgets como la excepción, lo veremos más adelante en este artículo).

A pesar de que generalmente hay personas que responden de un estilo de programación sobre el otro, cada uno presenta su propio conjunto de ventajas y desventajas..

En esta serie de dos partes, Stephen Harris y yo vamos a desglosar las dos formas en que puedes escribir los complementos de WordPress. Específicamente, voy a hablar sobre programación orientada a objetos, y él cubrirá la programación funcional.

Debido a que el nivel de experiencia de los lectores varía, vamos a hablar sobre la programación a un alto nivel, por lo que si eres un principiante, no deberías tener ningún problema para seguir adelante. Sin embargo, si usted es un desarrollador más experimentado, puede encontrar más información útil más adelante en el artículo..

Dicho esto, comencemos a observar un enfoque orientado a objetos para desarrollar complementos de WordPress.


Desarrollando Widgets de WordPress

Como se mencionó en la introducción, los complementos se pueden desarrollar para WordPress de dos maneras:

  1. Programación orientada a objetos
  2. Programación Funcional

El segundo artículo de la serie cubrirá la programación funcional, pero proporcionemos una definición de trabajo de programación orientada a objetos para que todos estemos en el mismo nivel a lo largo de este artículo..

Wikipedia dice:

La programación orientada a objetos (OOP) es un paradigma de programación que utiliza "objetos", generalmente instancias de una clase, que consta de campos de datos y métodos junto con sus interacciones, para diseñar aplicaciones y programas informáticos..

Los que tienen más experiencia con la programación informática., especialmente Aquellos que usan técnicas de programación orientadas a objetos, probablemente les guste esa definición.

Pero vamos a simplificarlo para los propósitos de este artículo:

La programación orientada a objetos es una técnica de programación que utiliza una colección de métodos relacionados para definir un programa informático o parte de un programa informático..

Bastante simple, ¿verdad? En nuestro caso, nuestros plugins son definitivamente. parte de un programa de computadora ya que están enganchados en WordPress.

Aunque veremos el código en el resto de este artículo, tenga en cuenta que los programas orientados a objetos se identifican mediante la agrupación de sus métodos relacionados y ese se realiza dentro del contexto de lo que se llama una clase, que cubriremos momentáneamente.

Una palabra sobre los widgets

Si bien es cierto que los complementos de WordPress pueden desarrollarse usando programación de objetos o programación funcional, existe una excepción cuando se trata de desarrollar widgets..

De acuerdo con el artículo del Codex sobre el desarrollo de widgets, se debe utilizar la siguiente estructura para escribir un widget:

la clase My_Widget amplía WP_Widget public function __construct () // widgets Process public function form ($ instance) // produce el formulario de opciones en admin public function update ($ new_instance, $ old_instance) // procesa las opciones del widget para guardar widget de función pública ($ args, $ instance) // genera el contenido del widget

Esto significa que todos Los widgets deben escribirse usando OOP. Si no ha visto un código como el anterior, lo cubriremos en la siguiente sección y debería proporcionarle todo lo que necesita saber para comprender lo que sucede..


Una introducción concisa a la POO

Antes de comenzar a analizar la creación de complementos basados ​​en OOP para WordPress, echemos un vistazo más de cerca a los conceptos básicos de OOP para asegurarnos de que tenemos una terminología clara y cómo funciona el paradigma..

Las clases

Como definimos anteriormente, OOP utiliza "una colección de métodos relacionados". Pero no podemos detenernos allí. Después de todo, la programación funcional hace lo mismo..

En la POO, estos "métodos relacionados" están todos relacionados en el contexto de lo que se llama un clase. En el ejemplo del widget anterior, verá el clase palabra clave como la primera palabra en el código.

Comienza en una línea que termina con un corchete de apertura (similar a las funciones), y luego encapsula, o envuelve, todas sus funciones relacionadas antes de terminar con el corchete de cierre (por ahora, ignore el se extiende palabra clave en el ejemplo del Widget (lo veremos en un momento).

Una agrupación lógica de funciones

Si recién está comenzando con las clases de escritura y se pregunta si una función pertenece a una clase determinada, pregúntese si la función suena como algo que haría una clase en particular..

Por ejemplo, en el ejemplo del widget anterior, actualizar El método es obviamente algo que un widget haría. Pero digamos que está escribiendo una clase que será responsable de leer una publicación del blog en la base de datos de WordPress. Tendría sentido para esa clase en particular tener una función llamada leer o read_by_id, pero debería tener una función llamada escribir? Qué pasa borrar?

Dependiendo de cómo hayas diseñado tu clase, posiblemente. Pero si el único propósito de la clase es leer datos, entonces probablemente no.

Y eso es OOP: es lógicamente agrupar sus funciones en una clase, pero dicha agrupación lógica depende de la responsabilidad que le está dando a su clase.

Temas avanzados en OOP

OOP es un poderoso paradigma que se emplea en toda la aplicación de WordPress. La POO permite operaciones avanzadas como la herencia (que está representada por el se extiende palabra clave en la clase Widget), patrones de diseño que son esencialmente soluciones existentes para problemas comunes.

Este artículo no intenta ser una inmersión profunda en la programación orientada a objetos. Simplemente se trata de proporcionar una base a partir de la cual podamos explorar las dos formas de escribir complementos de WordPress, pero los menciono aquí si está interesado en profundizar en la programación orientada a objetos..


Desarrollar complementos basados ​​en clases

Ahora que hemos definido la programación orientada a objetos y hemos explorado lo suficiente como para sentar las bases, es hora de comenzar a hablar de los componentes del desarrollo basado en OOP en el contexto de los complementos de WordPress..

A lo largo del resto de este artículo, cubriremos los aspectos básicos de lo que se requiere para escribir complementos basados ​​en OOP y las ventajas que ofrece..

Definiendo la clase

Antes de hacer cualquier cosa En el desarrollo orientado a objetos, tienes que definir tu clase. Suponiendo que ya tienes una idea de lo que tu clase va a hacer, esto generalmente es cuestión de encontrar lo que quieres nombrar a tu clase..

En su mayor parte, creo que ver el código de ejemplo siempre es ventajoso cuando se enseña realmente el código, así que echaremos un vistazo a la plantilla de WordPress Plugin.

Tenga en cuenta que el Plugin Boiler es un proyecto que originalmente creé para ayudar a impulsar los complementos basados ​​en OOP. Desde entonces ha sido contribuido por un número de personas diferentes. Lo estoy usando en este artículo porque demuestra el tema en cuestión.

Dicho esto, observe que la definición de clase para el Plugin Boilerplate se ve así:

clase PluginName // más por venir ...

Debido a que el Plugin Boilerplate es un punto de partida para el desarrollo, obviamente cambiaremos el nombre de la clase. Para este artículo, llamémoslo. DemoPlugin.

clase DemoPlugin // Más por venir ...

En este punto, estamos listos para comenzar a definir funciones que viven dentro de la clase.

El constructor

En OOP, la primera función que probablemente veas en una clase es una función llamada "el constructor" y PHP no es diferente..

Una definición simple y funcional del constructor es esta:

El constructor es donde se inicializan los datos que se van a utilizar en toda la clase..

Cómo funciona esto varía de un proyecto a otro, pero hay dos cosas principales que podemos hacer dentro del contexto de un complemento de WordPress:

  1. Configurar el dominio del texto para propósitos de localización
  2. Defina nuestras acciones y filtros (específicamente, nuestras acciones y nuestros filtros).

En nuestro DemoPlugin, vamos a hacer precisamente eso. Estableceremos un textdomain de complemento de demostración y registraremos acciones para registrar y poner en cola una hoja de estilo de ejemplo y un archivo de ejemplo de JavaScript.

Para completar en nuestro ejemplo, también registraremos un gancho para agregar texto al final del contenido que se muestra en una publicación..

Primero, definamos el constructor:

clase DemoPlugin función pública __construct () 

Tenga en cuenta que en PHP, un constructor está definido por una función pública llamada construir que está precedido por dos guiones bajos.

A continuación, definamos nuestro dominio de texto:

clase DemoPlugin función pública __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); 

En la línea de código anterior, tenga en cuenta que hemos definido la clave para que nuestro dominio de texto sea complemento de demostración y la línea espera encontrar los archivos de localización en un subdirectorio llamado lang en el directorio del plugin.

Debido a que la localización está fuera del alcance de este artículo, no haré más preguntas, pero puede revisar el código fuente de Plugin Boilerplate para ver cómo está configurado..

A continuación, definamos las acciones para registrar nuestras hojas de estilo y JavaScript, así como el filtro que agregará texto al final de nuestro contenido:

clase DemoPlugin función pública __construct () load_plugin_textdomain ('demo-plugin', false, dirname (plugin_basename (__FILE__)). '/ lang'); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles')); add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_scripts')); add_filter ('the_content', array ($ this, 'append_post_notification')); 

Si no está familiarizado con las acciones y los filtros, asegúrese de leer uno de mis artículos recientes aquí en Wptuts +, ya que explica la diferencia..

Ahora, si está familiarizado con el desarrollo de temas de WordPress o la programación funcional, es probable que esté acostumbrado a ver algo como lo siguiente:

add_action ('wp_enqueue_scripts', 'register_plugin_styles');

Más bien que:

add_action ('wp_enqueue_scripts', array ($ this, 'register_plugin_styles'));

Observe que la diferencia en las dos llamadas anteriores se encuentra en el segundo parámetro. Específicamente, en nuestro complemento estamos pasando una matriz, mientras que la primera línea de código es simplemente pasar una cadena.

Debido a que estamos desarrollando este complemento utilizando OOP, WordPress tiene que saber dónde llamar al register_plugin_styles método. Como vive dentro de nuestra clase, tenemos que decirle a WordPress que llame al método en una instancia de nuestra clase.

Tener sentido?

Esencialmente, le estamos diciendo a WordPress: Tengo este método llamado register_plugin_styles, pero necesita llamarlo en una instancia de esta clase (de ahí la esta palabra clave).

Si es nuevo en WordPress, pero proviene de un fondo de programación, entonces podría imaginar que le está diciendo a WordPress que haga esto:

$ demo = new DemoPlugin (); $ demo-> register_plugin_styles ();

De todos modos, la conclusión es que si está desarrollando sus complementos usando OOP, entonces debe registre sus ganchos utilizando una matriz con dos índices: el primero es $ esto y el segundo es el nombre de la función.

Una nota sobre paso por referencia y paso por valor

Los desarrolladores avanzados estarán familiarizados con la capacidad de PHP para pasar por referencia y por valor. En el desarrollo de WordPress, no es tan raro ver lo siguiente:

add_action ('wp_enqueue_scripts', array (& $ this, 'register_plugin_styles'));

Dónde esta se pasa por referencia; sin embargo, a partir de PHP 5.4, se ha eliminado la capacidad de pasar variables por referencia en el momento de la llamada. Es por eso que este tutorial está optando por pasar por valor..

Funciones

En la programación, las funciones son las unidades de código que son esencialmente responsables de "hacer algo". En la programación orientada a objetos, es útil pensar en ellos de manera ligeramente diferente.

En la POO, las clases suelen estar representadas por sustantivos. En nuestro caso, tenemos un DemoPlugin. Del mismo modo, las funciones son a menudo verbos. Es decir, son acciones que nuestro sustantivo puede tomar. En este punto, ya hemos optado por definir las siguientes funciones:

  • register_plugin_styles
  • register_plugin_scripts
  • append_post_notification

Observe cómo cada nombre de función representa una acción que se puede realizar. Esta es una buena regla general para emplear al escribir funciones.

En la programación funcional, en realidad solo existe la idea de funciones; sin embargo, en OOP, hay varios tipos diferentes de funciones, dos de las cuales son funciones "públicas" y funciones "privadas".

Funciones publicas

Las funciones públicas son funciones que son accesibles fuera de la clase. Esto significa que puedes llamar a estos métodos una vez que hayas instanciado la clase.

Esto es exactamente lo que hicimos anteriormente en el siguiente código:

$ demo = new DemoPlugin (); $ demo-> register_plugin_styles ();

Básicamente, estas funciones son accesibles por el público (donde el público puede ser un programador u otro objeto).

Las funciones que estamos escribiendo para registrar nuestras hojas de estilo, nuestro JavaScript y que estamos escribiendo para adjuntar texto a una publicación. tener Para ser marcado como público porque hay será ser un tercero llamando a ellos - WordPress.

Definamos las dos funciones para el wp_enqueue_scripts acción:

función pública register_plugin_styles () wp_register_style ('demo-plugin', plugins_url ('demo-plugin / css / plugin')); wp_enqueue_style ('demo-plugin');  public function register_plugin_scripts () wp_register_script ('demo-plugin', plugins_url ('demo-plugin / js / display.js')); wp_enqueue_script ('demo-plugin'); 

De nuevo, tenga en cuenta que estas dos funciones esperan que las hojas de estilo y JavaScript residan en css y js subdirectorios, respectivamente. Para ver esto en acción, recuerde revisar el Plugin Boilerplate.

Finalmente, definamos la función para el contenido filtrar:

función pública append_post_notification ($ content) $ notification = __ ('Este mensaje se adjuntó con un complemento de demostración.', 'demo-plugin-locale'); devuelve $ contenido. $ notificación; 

Tenga en cuenta que estamos usando la función __ para asegurarnos de que nuestro script esté localizado con el dominio del texto que definimos en el constructor.

Funciones privadas

Si cualquiera puede acceder a los métodos públicos, esto implicaría que nadie puede acceder a las funciones privadas, ¿verdad? En su mayor parte, eso es correcto: la única persona - o cosa - que pueden llamarse métodos privados son la clase en la que están definidos.

Eso significa que WordPress, los objetos de terceros, ni los programadores pueden llamar a funciones privadas mediante programación. Las funciones privadas solo se pueden llamar desde la clase que se usan.

En general, las funciones privadas son muy útiles cuando se escriben métodos de ayuda, es decir, son útiles para manipular datos internamente para ayudar a otra función a realizar su trabajo..

Para dar un ejemplo de trabajo, definamos una función privada que devolverá una cadena localizada que nuestro append_post_notification la función puede utilizar:

función privada get_localized_notification () return __ ('Este mensaje se adjuntó con un complemento de demostración.', 'demo-plugin-locale'); 

A continuación, vamos a refactorizar el append_post_notification Función para llamar a este nuevo ayudante:

función pública append_post_notification ($ content) return $ content. $ this-> get_localized_notification (); 

Observe que hemos simplificado la primera función agregando una segunda función. También podría argumentar que hemos aumentado la legibilidad de la función inicial agregando una llamada a una función con un nombre que ayude a aclarar lo que está sucediendo..

Quizás lo más importante a tener en cuenta es que para llamar a funciones privadas, debe prefijar la llamada de función con $ esto palabra clave y la ->. Esto le está diciendo a PHP: "Llame al get_localized_notification función que vive en esta clase."

En cualquier caso, le hemos dado a cada método una única responsabilidad, otra buena práctica en programación orientada a objetos, y hemos demostrado el uso de funciones tanto públicas como privadas..

Otros tipos de funciones

En la programación orientada a objetos, también hay otros tipos de funciones que están fuera del alcance de este artículo..

Para terminar, quería resumirlos aquí:

  • Las funciones estáticas son funciones que no requieren que se llame a una instancia de una clase. En su lugar, simplemente puede llamarlos directamente sobre el nombre de la clase. Por ejemplo: DemoPlugin :: use_this_static_method ().
  • Las funciones protegidas son como funciones privadas, excepto las subclases. Es decir, los únicos objetos que pueden acceder a las funciones protegidas son las subclases de la clase dada. Este tipo particular de función juega con el concepto de herencia que se mencionó anteriormente en el artículo.

Ventajas en WordPress

En este punto, hemos alcanzado todas las notas altas para el desarrollo de WordPress orientado a objetos. Para resumir las ventajas:

1. Todas las funciones están en contexto

Al usar programación orientada a objetos, no tiene que prefijar una función con el nombre del tema o el nombre del complemento en el que está trabajando, ni tiene que preocuparse por nombrar una función que pueda interferir con una función de WordPress, la función de otro tema, o la función de otro plugin.

En cambio, todas las funciones viven dentro del contexto de otra clase. Lo único de lo que hay que asegurarse es que su clase no tenga un nombre que interfiera con otra clase existente.

2. Llamándolos fuera de la API

Al utilizar la programación orientada a objetos, puede llamar a su complemento mediante programación desde fuera de la API de WordPress estándar.

Digamos que está desarrollando un tema y desea que se muestre algo en la barra lateral que proporciona su complemento. En la plantilla de la barra lateral, puede crear una instancia de su complemento y luego llamar a los métodos para que escriba la información en la barra lateral..

Esto es particularmente útil cuando está trabajando en una plantilla y desea proporcionar algunos datos predeterminados si el usuario no ingresa algo manualmente.


Conclusión

Como dijimos al principio del artículo: esta es solo una forma en la que puede desarrollar sus complementos de WordPress. El artículo de Stephen cubrirá cómo hacerlo usando programación funcional..

Después de leer este artículo, debería comprender mejor la programación orientada a objetos, sus ventajas, y debería poder seguir el código documentado en el Widget API, en mi Widget Boilerplate relacionado, e incluso en todos los lugares del código base de WordPress..


Recursos

  • Stephen Harris
  • Wikipedia en OOP
  • Escribiendo un plugin
  • API de plugin
  • API de widget
  • WordPress Widget Boilerplate
  • Plugin de WordPress
  • dominio del texto
  • Referencia de acción
  • Referencia de filtro
  • __