Crear complementos de WordPress con técnicas de OOP

El código orientado a objetos, entre otras cosas, puede ayudar a organizar y agregar reutilización a su código. En este tutorial, te enseñaré los conceptos básicos para escribir un complemento de WordPress utilizando técnicas orientadas a objetos. Usaremos la API de Dribbble como ejemplo para este tutorial. Listo?


Lo que vamos a aprender:

  • Beneficios de usar OOP para los complementos de WordPress.
  • Cómo configurar un shortcode.
  • Cómo configurar una etiqueta de plantilla.
  • Cómo habilitar shortcode en widgets de WordPress.
  • Ejemplo del mundo real usando la API de Dribbble.

¿Por qué usar OOP??

Antes de continuar con este tutorial, debe tener al menos una comprensión elemental de cómo escribir un complemento de WordPress. Jonathan ha escrito un increíble tutorial sobre "Cómo escribir un complemento de WordPress". Dale una lectura.

La creación de complementos de WordPress con código orientado a objetos es bastante eficiente y ordenada, en comparación con el uso de código de procedimiento. Es más fácil administrar el código base y expandirlo usando técnicas de herencia, lo que puede ser particularmente útil al escribir un complemento grande.


Dribbble

Para escribir un plugin de WordPress, primero necesitamos un sentido de la dirección. Vamos a escribir un complemento que mostrará las últimas fotos de Dribbble, utilizando su API REST. Luego agregaremos soporte de código corto para publicaciones y widgets, y etiqueta de plantilla para temas.


Paso 1 - Configuración de la clase de complemento

El código orientado a objetos se basa en clases y métodos (funciones). Vamos a crear nuestra clase principal, que interactuará con los ganchos y filtros de WordPress..

 clase WPDribbble función pública __construct ()  $ wpDribbble = new WPDribbble ();

Las clases de PHP tienen una función constructora., __construir, que se ejecuta tan pronto como se crea una instancia de una nueva instancia de una clase. Todos los ganchos y filtros de WordPress se registrarán en el constructor de nuestra clase de plugin. Vamos a seguir adelante y registrar un código corto para nuestro complemento. los add_shortcode () La función / gancho irá bajo la función del constructor.

La nueva instancia de una clase / objeto se registra usando el nuevo palabra clave. Consulte la última línea en el código de abajo.

 clase WPDribbble función pública __construct () add_shortcode ('Dribbble', array ($ this, 'shortcode'));  shortcode de función pública ()  $ wpDribbble = new WPDribbble ();
  • add_shortcode - El primer parámetro es la etiqueta de código corto, y el segundo es la función de devolución de llamada.

Observe cómo estamos usando un formación en el parámetro de función de devolución de llamada? Para registrar funciones de devolución de llamada dentro de un objeto, tenemos que usar un formación.

El primer elemento de la matriz hace referencia al objeto, a través de $ esto. El segundo elemento en el formación es el nombre del método dentro de la clase. Todos los ganchos y filtros deben ser referenciados así dentro de una clase.

Sigo confundido?

 # 1. Uso estándar add_shortcode ('shortcode_name', 'shortcode_func'); function shortcode_func () // El contenido de esta función se ejecutará cuando el blogger // use el shortcode [shortcode_name].  # 2. Con PHP 5.3, podemos pasar una función anónima. add_shortcode ('shortcode_name', function () // El contenido de esta función se ejecutará cuando el blogger // use el [shortcode_name] shortcode.); # 3. Dentro de una clase WPDribbble public function __construct () add_shortcode ('Dribbble', array ($ this, 'shortcode'));  shortcode de función pública () // El contenido de esta función se ejecutará cuando el blogger // use el shortcode [shortcode_name]. 

Paso 2 - Clase API Dribbble

Dado que actualmente no requerimos ninguna función de API sofisticada, vamos a crear un contenedor de API bastante simple para Dribbble. Ya hay una biblioteca disponible para Dribbble, pero, por el bien de este tutorial, vamos a escribir la nuestra. Te ayudará a entender los conceptos detrás de este tutorial..

Vamos a escribir un DribbbleAPI. objeto, y registrar un método llamado getPlayerShots () para interactuar con la API de Dribbble y devolver una formación de los últimos tiros.

Vamos a crear un nuevo archivo para esta clase, llamado DribbbleAPI.php

 clase DribbbleAPI // url a Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // nombre de usuario o usuario de Dribbble protegido $ usuario; 

Arriba, estamos configurando dos variables de clase.

  • $ apiUrl - El enlace a la API de Dribbble, donde se enviarán las llamadas.
  • $ usuario - El nombre de usuario o la identificación de usuario de un usuario de Dribbble. Este valor se establecerá desde dentro del constructor (__construir) método.
 clase DribbbleAPI // url a Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // nombre de usuario o usuario de Dribbble protegido $ usuario; función pública __construct ($ user) $ this-> user = $ user; 

Al constructor se le pasa un $ usuario variable, que luego el constructor pasa a la propiedad de clase, llamada usuario.

Prefijamos la propiedad, o nombre de variable con público para especificar que el valor de esta propiedad se puede recuperar desde fuera de la clase. Si por el contrario deseamos limitar el acceso a la propiedad solo a esto clase, y tal vez cualquier claseEs que heredamos de ella, usaríamos el protegido prefijo. Esta práctica se conoce como encapsulación.

Tenemos la base lista para nuestro contenedor Dribbble API. Ahora, vamos a escribir un nuevo método, llamado getPlayerShots (). El propósito de esto método será consultar la API y convertir el resultado en un formación para uso dentro de nuestro plugin.

 clase DribbbleAPI // url a Dribbble api protected $ apiUrl = 'http://api.dribbble.com/'; // nombre de usuario o usuario de Dribbble protegido $ usuario; función pública __construct ($ user) $ this-> user = $ user;  función pública getPlayerShots ($ perPage = 15) $ user = $ this-> user; $ json = wp_remote_get ($ this-> apiUrl. 'players /'. $ user. '/ shots? per_page ='. $ perPage); $ array = json_decode ($ json ['body']); $ shots = $ array-> shots; devuelve $ tiros; 

Aprende más sobre wp_remote_get.

los getPlayerShots La función recupera al usuario de la variable de clase. Utiliza WordPress ' wp_remote_get Función para consultar la API de Dribbble. La API responde a nuestra consulta con una cadena JSON, que luego se analiza en una formación y enviado de vuelta a la función utilizando el regreso palabra clave.

Esto es todo lo que requerimos de la API en este momento, simplemente un formación de tiros de jugador. Si requerimos más funcionalidad en el futuro, podemos agregar más métodos a la corriente clase, o crear un nuevo clase que se extiende éste. Una vez más, esto se conoce como herencia.


Paso 3 - Integrar el DribbbleAPI Clase

Esta es la parte divertida; el recién horneado DribbbleAPI clase entrará en uso. Vamos a recorrer las tomas extraídas de la API y generaremos un html Lista de tomas, que se pasará al código corto y la etiqueta de la plantilla. Durante el bucle, las imágenes de Dribbble de tamaño completo se almacenarán en caché y se guardarán en la carpeta del complemento, y las miniaturas se generarán utilizando TimThumb.

Para determinar si las imágenes completas ya están almacenadas localmente, el ruta del plugin es requerido. Además, para generar las miniaturas con timthumb, la url de plugin es requerido. Para este propósito, crearemos dos variables de clase llamadas pluginPath y pluginURL en nuestro WPDribbble clase, y luego establecer sus valores desde dentro del constructor método.

Configuración de PluginPath y PluginUrl

 clase WPDribbble protected $ pluginPath; protected $ pluginUrl; función pública __construct () // Establecer ruta del complemento $ this-> pluginPath = dirname (__ FILE__); // Establecer la URL del complemento $ this-> pluginUrl = WP_PLUGIN_URL. '/ wp-Dribbble'; add_shortcode ('Dribbble', array ($ this, 'shortcode')); 

getImages () Método

Crear un nuevo método dentro de WPDribbble clase, llamado getImages.

Dentro de una clase, Puedes usar nombres genéricos para funciones. No entrarán en conflicto con otros complementos ni con las funciones integradas de WordPress, porque están bajo la clase espacio de nombres.

 función pública getImages ($ usuario, $ imágenes = 3, $ ancho = 50, $ altura = 50, $ título = verdadero) 
  • $ usuario - Nombre de usuario o ID de usuario de Dribbble. $ usuario Se utilizará al registrar una nueva instancia de la DribbbleAPI clase.
  • $ imagenes - Número de imágenes para renderizar.. $ imagenes se utilizará al consultar la API a través de la getPlayerShots método.
  • $ ancho y $ altura - Timthumb se utilizará para generar miniaturas.
  • $ caption - Opción para renderizar el título de una imagen..

A continuación, vamos a incluir el DribbbleAPI clase en el getImages () función, y crear una nueva instancia de ella para agarrar las imágenes.

 función pública getImages ($ usuario, $ imágenes = 3, $ ancho = 50, $ altura = 50, $ título = verdadero) incluye 'DribbbleAPI.php'; $ DribbbleAPI = nuevo DribbbleAPI ($ usuario); $ shots = $ DribbbleAPI-> getPlayerShots ($ images); si ($ tiros) 

los $ tiros variable en el código se rellena con una formación de tres Dribbbles recientes de la $ usuario.

Como se mencionó anteriormente, vamos a recorrer el $ tiros formación, y guarda las imágenes a tamaño completo localmente para propósitos de almacenamiento en caché. Las imágenes en caché se utilizarán con TimThumb para servir las miniaturas. Para almacenar imágenes completas y miniaturas generadas por TimThumb, cree dos carpetas. Nosotros usaremos imágenes completas / para almacenar las imágenes a tamaño completo, y cache/ para las miniaturas, ya que ese es el nombre de carpeta predeterminado para TimThumb.

El HTML para la lista se generará dentro del $ tiros lazo.

 función pública getImages ($ usuario, $ imágenes = 3, $ ancho = 50, $ altura = 50, $ título = verdadero) incluye 'DribbbleAPI.php'; $ DribbbleAPI = nuevo DribbbleAPI ($ usuario); $ shots = $ DribbbleAPI-> getPlayerShots ($ images); if ($ shots) $ html [] = '
    '; foreach ($ tiros como $ tiro) $ imagen = $ tiro-> image_url; // url de la imagen $ fileName = $ shot-> id. '.png'; // generando un nombre de archivo image_id.png si (! file_exists ($ this-> pluginPath. '/ full-images /'. $ fileName)) // verifique si existe la imagen completa $ rawImage = wp_remote_get ($ image); // obtener la imagen completa $ newImagePath = $ this-> pluginPath. '/ full-images /'. $ fileName; $ fp = fopen ($ newImagePath, 'x'); fwrite ($ fp, $ rawImage ['body']); // guarda la imagen completa fclose ($ fp); // generar url en miniatura $ localImage = $ this-> pluginUrl. '/timthumb.php?src='. strstr ($ this-> pluginPath, 'wp-content'). '/ full-images /'. $ fileName. '& w ='. $ ancho. '& h ='. $ altura. '& q = 100'; if ($ caption) // si caption es verdadero $ captionHTML = '

    '. $ disparo-> título. '

    '; // combina la url de disparo, el título y la miniatura para agregar a la lista ul $ html [] = '
  • url '"título ="'. $ disparo-> título. '">' . $shot->título ''.$captionHTML.'
  • '; $ html [] = '
'; return implode ("\ n", $ html);

Agregando clases

Siempre es una buena idea agregar clases a cada elemento de su complemento. Esto proporciona a los usuarios avanzados de su complemento la libertad de personalizarlo. Evite utilizar CSS en línea para el contenido que se genera a través de su complemento.


Paso 4 - Configuración del código corto

Los códigos cortos, como su nombre indica, permiten a los usuarios agregar fácilmente contenido complejo a las publicaciones del blog.

Ya tenemos el add_shortcode Enganche listo en nuestro constructor clase plugin. Ahora, vamos a escribir el código corto método dentro de nuestro clase, lo cual exractará los atributos del código corto y devolverá las imágenes de Dribbble usando el getImages () método.

Estaremos llamando a nuestro código corto [Dribbble]. Como se mencionó anteriormente, el nombre del shortcode está determinado por el primer parámetro en el add_shortcode función. Se utilizará con los atributos requeridos para la getImages () método. Por ejemplo: [Usuario de Dribbble = imágenes de haris = 5 ancho = 100 altura = 100 título = verdadero].

 función pública shortcode ($ atts) // extraer los atributos en las variables extracto (shortcode_atts (array ('images' => 3, 'width' => 50, 'height' => 50, 'caption' => true,) , $ atts)); // pase los atributos a la función getImages y haga que las imágenes devuelvan $ this-> getImages ($ atts ['usuario'], $ images, $ width, $ height, $ caption); 

Añadir soporte de Shortcode para los widgets de WordPress

De forma predeterminada, los widgets de WordPress no admiten códigos cortos, sin embargo, mediante el uso de widget_text filtro, podemos forzar el soporte de shortcode en widgets de WordPress.

Podemos añadir el filtro en nuestra WPDribbble constructor de objetos.

 función pública __construct () // Establecer ruta del complemento $ this-> pluginPath = dirname (__ FILE__); // Establecer la URL del complemento $ this-> pluginUrl = WP_PLUGIN_URL. '/ wp-Dribbble'; add_shortcode ('Dribbble', array ($ this, 'shortcode')); // Agregar soporte de shortcode para widgets add_filter ('widget_text', 'do_shortcode'); 

Paso 5 Configuración de la etiqueta de plantilla

La etiqueta de la plantilla se puede utilizar directamente en los temas de WordPress. El propósito básico de la etiqueta de plantilla será crear una nueva instancia de nuestro WPDribbble clase, y llamar a la getImages () método. La etiqueta de la plantilla será una función PHP simple y se debe registrar fuera del complemento clase. Necesita tener un nombre único; de lo contrario, entrará en conflicto con las funciones / complementos con un nombre similar. Como nuestro plugin se llama WP-Dribbble, llamaremos la etiqueta de la plantilla, wp_Dribbble ().

 función wp_Dribbble ($ usuario, $ imágenes = 3, $ ancho = 50, $ altura = 50, $ caption = verdadero) $ wpDribbble = nuevo WPDribbble; echo $ wpDribbble-> getImages ($ user, $ images, $ width, $ height, $ caption); 

Voila!

¡Felicidades! Has escrito con éxito un plugin de WordPress con OOP. Si tiene alguna pregunta, avíseme y haré todo lo posible para ayudarlo.?