Cómo utilizar Composer con WordPress
José Debuchy
Tooling
Nota: este post toma muchos conceptos de este excelente artículo y los combina con otras experiencias que hemos tenido con composer.
Qué es Composer
Composer es un gestor de dependencias para PHP. De la misma manera que existe npm para JavaScript, RubyGems para Ruby o pip para Python, estos gestores de dependencias se encargan de manejar todo el código que rodea a tu proyecto.
Si nuestro proyecto fuera el desarrollo de un theme a medida en WordPress, Composer se encargaría de gestionar:
- La instalación de WordPress
- La instalación de sus Plugins
- La instalación de paquetes que pueden servir para mejorar tu código tanto en el Theme como a nivel general.
Composer interactúa con paquetes. Un paquete puede ser un archivo o una carpeta local, un zip remoto, un repositorio git, etc.
A su vez cada uno de estos gestores de dependencias suele contar con un registro global de sus paquetes. En el caso de Composer, este registro se llama Packagist.
Ventajas
- Todo lo que no está relacionado específicamente con tu proyecto está declarado en un solo lugar (composer.json).
- Composer se encarga de la instalación y la actualización de los paquetes.
- Puedes ajustar y bloquear tu proyecto a las versiones que desees de cada paquete.
- No tienes que tener ningún código de terceros que no sea específico de tu proyecto dentro de tu repositorio.
Cómo instalarlo
Sugerimos seguir las instrucciones de la web oficial de composer de acuerdo al sistema operativo que estés utilizando.
Cómo funciona
Composer se basa en un archivo json llamado composer.json
en donde se listan los paquetes con los que uno quiere trabajar y a la vez, se le pueden incluir ciertas funcionalidades o características que queremos que tenga el proceso.
Este es un ejemplo sencillo.
{
"require": {
"monolog/monolog": "2.0.*"
}
}
Si corremos composer install
sobre el directorio donde se encuentra el archivo composer.json
veremos que se creará una carpeta llamada vendor en donde se instalará el paquete que acabamos de instalar, en este caso el paquete monolog que se encuentra en Packagist.
A su vez, para las librerías que specifiquen un método de auto-cargado, composer generará un archivo vendor/autoload.php
que permitirá tener cargada la librería en nuestro proyecto en apenas unos pasos.
Cómo funciona WordPress con Bedrock
Composer nos permite pensar a WordPress como una dependencia del proyecto. Por más que sea el corazón del mismo, y en el 99.99% el hecho que no esté este paquete dejaría sin sentido un proyecto de estas características, cumple todas las características de una dependencia.
La estructura original de WordPress suele generar confusión:
index.php
license.txt
readme.html
wp-activate.php
wp-admin
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-content
wp-cron.php
wp-includes
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php
En esta estructura todos los archivos principales de WP están en la raíz y la carpeta wp-content
suele contener los archivos particulares de cada proyecto.
Bedrock rediseña esta estructura y la adapta a una estructura moderna:
.env
.gitignore
config
composer.json
web
-- app (en reemplazo de wp-content)
-- index.php
-- wp
-- wp-config
En esta estructura la carpeta web contiene los archivos que le dan funcionamiento al proyecto divididos en 2 carpetas: app, que hace las veces de wp-content y wp, que contiene el resto de los archivos y carpetas esenciales de WordPress.
WordPress y Composer
Todos los proyectos composer necesitan un archivo composer.json
. Lamentablemente, el proyecto oficial de WordPress no cuenta con este archivo y parece que no lo hará, por el momento.
Es por eso que ante esto, el equipo de Roots armó un paquete propio de composer que permite conectarse con el repositorio original de WordPress y generar un composer.json que se adapte a los requerimientos.
https://roots.io/announcing-the-roots-wordpress-composer-package/
Carpetas de instalación a medida
Una vez que instalamos WordPress en esta nueva estructura podemos instalar los plugins que acompañarán nuestro proyecto. Anteriormente dijimos que, por defecto, composer instalaba los paquetes en la carpeta vendor.
Gracias a la funcionalidad composer-installers
podemos especificar un type
de paquete y definirle una ubicación distinta a vendor
en nuestro proyecto.
"extra": {
"installer-paths": {
"web/app/mu-plugins/{$name}/": ["type:wordpress-muplugin"],
"web/app/plugins/{$name}/": ["type:wordpress-plugin"],
"web/app/themes/{$name}/": ["type:wordpress-theme"]
},
...
},
De esta forma al instalar un plugin podemos estar seguros que, si el composer.json
del plugin tiene un type wordpress-plugin
, el mismo será instalado en la carpeta web/app/plugins
Repositorio público de Plugins
Para el caso de los plugins públicos, se creó un servicio llamado WordPress Packagist, que mantiene una paridad con el repositorio público de plugins (y themes) de WordPress, con sus distintas versiones y permite que estos plugins sean manejados como paquetes de composer.
De esta manera, si queremos agregar un plugin a nuestro proyecto, el archivo composer.json debería verse de esta manera
{
"require": {
"wpackagist-plugin/akismet":"*",
"wpackagist-plugin/contact-form-7":"^5.4",
"wpackagist-plugin/wordpress-seo":">=16.8",
}
}
Al correr composer update
tendremos instalados los plugins que se encuentran mencionados en esa lista.
Como vemos, composer nos permite fijar la versión de un plugin que queremos utilizar, nos permite decirles que se queden dentro de una major release, o también nos permite decirle que siempre que corremos composer update
se actualice a la versión más nueva.
Plugins Privados
Para el caso de plugins premium o privados tenemos que encontrar una forma de poder pasarle las credenciales sin exponerlas al público y que composer las interprete. Analizaremos algunas de las alternativas que se suelen utilizar.
ACF
ACF ofrece una opción de descarga mediante una URL a la que se le puede pasar la licencia para descargar su versión PRO. Existe un plugin de composer llamado private-composer-installer que permite pasar variables .env
al archivo composer.
De esta manera, definimos la constante ACF_PRO_KEY en el archivo .env y podemos descargar la versión que elijamos de ACF.
"repositories": [
...
...
{
"type": "package",
"package": {
"name": "advanced-custom-fields/advanced-custom-fields-pro",
"version": "5.9.0",
"type": "wordpress-plugin",
"dist": {
"type": "zip",
"url": "<https://connect.advancedcustomfields.com/index.php?a=download&p=pro&k={%ACF_PRO_KEY}>"
},
"require": {
"composer/installers": "^1.4",
"ffraenz/private-composer-installer": "^5.0.1"
}
}
},
...
...
],
"require": {
...
...
"advanced-custom-fields/advanced-custom-fields-pro": "5.9",
...
...
}
WP Migrate Pro
Este plugin ofrece la posibilidad de pasar sus credenciales a través de un archivo auth.json
, que puede ser instalado en la raíz del proyecto si se quiere utilizar de manera local o en ~/.composer/
si se utiliza MacOS y se quiere instalar de forma global.
El plugin proveerá un username y un password que será utilizado de la siguiente manera:
## auth.json
{
"http-basic": {
"composer.deliciousbrains.com": {
"username": "{COMPOSER_API_USERNAME}",
"password": "{COMPOSER_API_PASSWORD}"
}
}
}
## composer.json
"repositories": [
{
"type":"composer",
"url":"<https://composer.deliciousbrains.com>"
},
...
]
"require": {
...
"deliciousbrains-plugin/wp-migrate-db-pro": "1.8.1"
...
...
}
Satispress
Satispress es un plugin de WordPress que intenta solucionar este problema de plugins premium, identificando los plugins premium del proyecto y guardándolos en el servidor del proyecto, que permite ser accedido a través de un composer.json
que crea el plugin y da acceso a las nuevas versiones.
En este link se puede encontrar una guía de cómo instalar el plugin paso a paso.
Resumen
Composer es una herramienta indispensable hoy en día para poder trabajar en proyectos grandes, con muchos miembros del equipo a la vez. Composer nos permite tener las dependencias de manera ordenada, sencilla y portable, mientras nos enfocamos en trabajar en el código específico de cada proyecto. Sugerimos aprender a utilizar esta herramienta y sacar el mayor provecho posible de sus funcionalidades.
Si utilizas Composer en algún proyecto con Bedrock u otra framework de WordPress y te gustaría agregar tus comentarios, nos encantaría conocer cómo lo utilizas, y qué beneficios te genera en tu rutina como developer.