Skip to content

Cómo utilizar Composer con WordPress

José Debuchy

Aug 1, 2021 | 7 min to read |

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.

Author

José Debuchy