CésarHdz.com

Integrar Composer a WordPress es algo complejo debido a la arquitectura de WordPress, pero vale la pena, porque a cambio, obtenemos:

  • Un aplicación más portable
  • Tener un mayor control de las dependencias como plugins y librerías.
  • Automatizar el proceso para instalar WordPress y sus dependencias.
  • Compartir recursos entre dependecias.

A continuación describo los pasos que seguí para tener la intalación de WordPress funcionando junto con Composer.

Requerimientos

Para comenzar, necesitamos tener instalado:

  • PHP 5.4
  • Composer
  • Git

Adicionalmente, utilizaremos dos librerias para facilitar el proceso, ambas pueden declararse como dependencias dentro de Composer.

composer/installers
Libreria para poder instalar plugins y temas en ubicaciones especifcas, difrentes al folder vendor.
wp-cli/wp-cli
Esta libreria nos permite realizar las acciones más comunes del administrador de WordPress, pero desde la terminal.

Archivo composer.json

Para iniciar nuestro proyecto, comenzamos creando el directorio del proyecto:

$ mkdir wp-app && cd wp-app

Y ejecutamos:

$ composer init

Composer nos hará algunas preguntas básicas sobre nuestro projecto, debemos configurarlo de la siguiente forma:

Minimum Stability []: dev
...
Would you like to define your dependencies (require) interactively [yes]? yes
Search for a package []: composer/installers (1)

// Nos aparecerán varios paquetes con nombres parecidos, en los dos casos debemos escoger el primero, es decir: [0].

Enter the version constraint to require []: 1.*

Search for a package []: wp-cli/wp-cli
Enter the version constraint to require []: v0.11.1

Al término tendremos nuestro archivo composer.json. Hasta este momento no se ha instalado ninguna dependencia, antes de ejecutar composer install registraremos WordPress.

Registrar Repositorio WordPress

Composer utiliza Packagist como repositorio principal pero nos da la posibilidad de registrar repositorios personalizados. Utilizaremos esta característica para registrar WordPress, ya que actualmente no está disponible dentro de Packagist. Para hacer el proceso más fácil hice un pequeño repositorio tipo Composer donde está registrado WordPress, así sólo necesitamos agregarlo a nuestro archivo composer.json.

"repositories" : [
    { 
        "type" : "composer",
        "url" : "https://raw.github.com/cesarhdz/wordpress-packages/master/"
    }   
]

Una vez rergistrado el repositorio sólo necesitamos decir que nuestro proyecto requiere WordPress

"require": {
    ...
    "wordpress/wordpress" : "3.5.1"
}

Ahora sí ejecutamos

$ composer install

Y en unos segundos tendremos todas nuestras dependencias dentro de la carpeta vendor. Sólo nos falta configurar WordPress.

Instalación de WordPress

WordPress permite poner todos los archivos dentro una subcarpeta, de hecho, este paso es necesario para WordPress Multisite. Utilizaremos esta característica para poder ejecutarlo desde la carpeta /vendor/wordpress/wordpress, que es donde lo tenemos instalado.

Si ya contamos con nuestra base de datos y credenciales1, el primer paso es generar el archivo de configuracion utilizando wp-cli:

$ vendor/bin/wp core config --path=vendor/wordpress/wordpress --dbname=wp-composer --dbuser=root  --dbpass=***

Nos aparecerá un mensaje:

Success: Generated wp-config.php file.

Archivo wp-config personalizado

Ahora necesitamos copiar el archivo wp-config a nuestro directorio raíz, para poder tener control de la configuración, y si actualizamos WordPress los cambios no se pierdan, también podremos agregar algunas constantes útiles2.

$ cp vendor/wordpress/wordpress/wp-config.php local-config.php

Reemplazamos el contenido de wp-config por lo siguiente código:

<?php 

require(dirname(dirname(dirname(dirname(__FILE__)))) . '/local-config.php');

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

En nuestro archivo local-config.php eliminamos las últimas líneas, a partir de /* That's all ....

Paths y URLs

En nuestro archivo de configuración podemos agregar las siguientes constantes SITE_URL y HOME_URL con las que le decimos a WordPress donde ejecutar la parte de administración y el sitio.

/**
 * WP_HOME
 * URL donde estará el home
 */
define('WP_HOME', 'http://localhost:1234/');

/**
 * Site URL
 * URL del archivo de los archivos de WordPress
 *
 * Add vendor/wordpress/wordpress
 */
define('WP_SITEURL',  WP_HOME . 'vendor/wordpress/wordpress/');

Estructura de la Aplicación

Es recomendable mover el folder de contenido a una ubicación más accesible, puesto que dentro se incluye nuestro proyecto. De lo contrario si actualizamos WordPress via composer update nuestros archivos se modificarán. Para ello agregamos las constantes WP_CONTENT_DIR y WP_CONTENT_URL al archivo local-config.php.

define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/app' );
define( 'WP_CONTENT_URL', WP_HOME . 'app/');

Opcionalmente podemos copiar el contenido de vendor/wordpress/wordpress/wp-content a la carpeta content, o generar un tema desde cero, como veremos más adelante.

$ mkdir app
$ cp vendor/wordpress/wordpress/wp-content/* app/ -r

También debemos copiar el archivo index.php de WordPress a nuestro directorio raíz

$ cp vendor/wordpress/wordpress/index.php index.php

Y reemplazamos en la última línea la dirección para incluir wp/header:

/** Loads the WordPress Environment and Template */
require('./vendor/wordpress/wordpress/wp-blog-header.php');

Con estos cambios, la estructura de nuestro proyecto quedaría así:

+ wp-app
     + app
        + theme
        + plugins
        + uploads
    + vendor
        + wordpress
             + wordpress
    - composer.json
    - wp-config.php
    - index.php

Estamos listos para instalar WordPress y lo hacemos a través del siguiente comando:

$ vendor/bin/wp --path=vendor/wordpress/wordpress core install --title="wp-app" --admin_email="mail@example.com" --admin_password=***

Si nos aparece un mensaje como el siguiente, ya tenemos nuestro sitio instalado:

Success: WordPress installed successfully.

Podemos utilizar el servidor de PHP, para probar que funciona, ejecutando php -S localhost:1234 y visitando en nuestro navegador http://localhost:1234

Generación de temas

WP-CLI tiene un comando llamado scaffold que permite generar temas, plugins, custom post types, etcétera. Vamos a generar un tema y activarlo, utilizaremos Underscores como plantilla:

$ vendor/bin/wp --path=vendor/wordpress/wordpress scaffold _s miTema
Success: Switched to 'MiTema' theme.

$ vendor/bin/wp --path=vendor/wordpress/wordpress theme activate miTema
Success: Switched to 'MiTema' theme.

Y tendremos nuestro tema listo para comenzar a desarrollar.

Instalar plugins

WordPress cuenta con una gran cantidad de plugins, sin embargo, son escasos o nulos los que estan registrados en Packagist. Actualmente para incluir un plugin via Composer, debemos registrar un repositorio especial. Para este artículo, utilizaremos el mismo repositorio que para WordPress, y como ya lo registramos, basta con agregarlo a las dependencias:


"repositories" : [ ... { "type":"composer", "url":"http://wpackagist.org" } ], ... "require" : { ... "wpackagist/wp-markdown" : "1.3"

Como vimos, las dependencias se guardan dentro del folder vendor, pero utilizando Composer Installers, previamente requerido, podemos definir ubicaciones personalizadas basadas en el tipo de paquete. En el caso de los plugin de WordPress deben registrarse con el tipo wordpress-plugin. Por default se agregan en la ruta wp-content/plugins, pero para que funcione con nuestra nueva estructura debemos agregar:

"data": {
    ...
   "composer-installers": {
        "app/plugins" : ["type:wordpress-plugin"]
    }

Para instalar el plugin actualizamos composer con $ composer update, y con wp-cli verificamos que se puede activar

$ vendor/bin/wp --path=vendor/wordpress/wordpress/ plugin list
+-------------+----------+-----------+---------+
| name        | status   | update    | version |
+-------------+----------+-----------+---------+
| wp-markdown | inactive | none      | 1.3     |
+-------------+----------+-----------+---------+

Para activarlo, ejectuamos

$ vendor/bin/wp --path=vendor/wordpress/wordpress/ plugin activate wp-markdown

Conclusión

Installar WordPress a través de Composer requiere de más pasos que una instalación normal pero vale la pena porque nos permite tener un entorno de desarrollo más consistente y fácil de reproducir en diferentes ambientes. Incluso no sería difícil desarrollar un pequeño instalador o repositorio base para agilizar el proceso.


  1. Podemos generar la base de datos desde la consola, con las siguientes líneas:

    mysql -u username -p
    ....
    mysql> create database dbname;  
    mysql> grant usage on *.* to username@localhost identified by 'password';  
    mysql> grant all privileges on dbname.* to username@localhost;
    

  2. Idealmente las dependencias no deberían de modificarse, pero recordemos que WordPress no es OOP y no se apega a las especificaciones PSR. Por lo que la mejor forma de que funcione es modificando el archivo wp-config, de tal manera que podamos incluir un archivo externo desde la configuración, que nos permitirá hacer más portable la aplicación. 

Posted in Desarrollo