Skip to main content
Engineering Notes · February 2014

WordPress dengan Composer

Portrait of Komang Artha Yasa — technology leader, two decades building digital platforms across marketplaces, retail, logistics, fintech, and banking.

Setelah beberapa tahun (seriously) saya akhirnya harus bersentuhan lagi dengan WordPress. Banyak yang berubah sejak terakhir saya ngoprek — semakin bagus, tapi codebase-nya juga semakin besar karena pergeseran fokus dari sekedar engine blog menjadi CMS platform yang sangat fleksibel.

Project yang sedang saya kerjakan butuh beberapa 3rd-party library, jadi saya coba integrasikan WordPress dengan Composer untuk mempermudah dependensi dan autoloading. Awalnya saya pikir akan sulit — WordPress di sini berperan ganda sebagai webroot sekaligus package dependency. Ternyata salah; sudah ada library Composer yang bisa mendefinisikan webroot directory dan webroot package sehingga kita bisa mendikte di mana paket di-deploy.

Kabar baik berikutnya: wpackagist.org me-mirror plugin dan theme dari wordpress.org dan menggunakan composer installer, jadi kita bisa instal plugin/theme via Composer dengan mengkonfigurasi installer-paths di composer.json.

Konfigurasi composer.json

{
  "name": "chz/test",
  "description": "whatever it takes. lets roll",
  "license": "MIT",
  "repositories": [
    { "type": "composer", "url": "https://wpackagist.org" },
    {
      "type": "package",
      "package": {
        "name": "wordpress",
        "type": "webroot",
        "version": "3.8",
        "dist": {
          "type": "zip",
          "url": "https://github.com/WordPress/WordPress/archive/3.8.zip"
        },
        "require": { "fancyguy/webroot-installer": "1.0.0" }
      }
    }
  ],
  "require": {
    "php": ">=5.3.0",
    "wordpress": "3.8",
    "fancyguy/webroot-installer": "1.0.0",
    "wpackagist/wp-original-media-path": "1.3.0",
    "wpackagist/w3-total-cache": "0.9.3"
  },
  "require-dev": {
    "wpackagist/debug-bar": "~0.8",
    "wpackagist/debug-bar-console": "~0.3"
  },
  "extra": {
    "wp-content": "public/content",
    "webroot-dir": "public/wp",
    "webroot-package": "wordpress",
    "installer-paths": {
      "public/content/plugins/{$name}/": ["type:wordpress-plugin"],
      "public/content/themes/{$name}/":  ["type:wordpress-theme"]
    }
  }
}

Beberapa poin penting:

  • Deklarasi package repositories untuk webroot-installer, wpackagist, dan wordpress.
  • Spesifik untuk WordPress kita tandai sebagai webroot.
  • Di blok extra, webroot-package di-deploy ke webroot-dir. Semua dependency bertipe wordpress-plugin di-deploy ke public/content/plugins/{$name}/.
  • Wpackagist otomatis menandai plugin dan theme dengan tipe yang sesuai.

Struktur Direktori

Hasilnya, dengan sedikit manual copy-paste:

public/
├── content/
│   ├── themes/
│   └── plugins/
├── media/
├── wp/
├── index.php
├── wp-config.php
├── wp-config-production.php
└── wp-config-local.php
vendor/
composer.json

Trus Ngapain Susah-susah?

Pertanyaan yang valid kalau ada 5-minutes install. Personal preference — berikut yang saya suka dari instalasi kustom ini:

  • Mencegah backward-compatibility break saat update core/plugin: GUI update di wp-admin di-disable, semua update dilakukan via Composer. composer update selesai.
  • Karena instalasi WP terpisah dari file webroot yang sudah dimodifikasi, composer update tidak konflik.
  • Maintenance dependency lebih gampang — import dan autoloading di-handle Composer. A big win.
  • VCS lebih bersih, hanya berisi codebase milik kita.
  • Dengan bantuan wp-original-media-path, struktur URL di front-end bebas dari prefix bawaan wp- — termasuk asset theme/plugin dan uploaded media. Hanya akses wp-admin yang masih menggunakan URI WordPress.

It worth the extra work.

Suksma.