Unul dintre cele mai frustrante lucruri pe care trebuie trebuia să le fac era să includ toate clasele în functions.php
(sau, dacă scriam un plugin, în plugin.php
). Doar că… se poate și altfel, folosind Composer.
Instalarea Composer
În funcție de cum tratezi proiectul, poți instala composer ori în directorul temei, ori în wp-content
. În terminal va trebui doar să scrii composer init
și să urmezi pașii. Nu este nevoie să alegi nici un pachet în acest moment, ci doar să ai un composer.json
în rădăcina proiectului. După ce ai terminat toți pașii, este nevoie să rulezi și composer install
.
Acum, din functions.php
va trebui să incluzi vendor/autoload.php
. Dacă ai ales instalarea în wp-content
, va trebui să îl incluzi așa:
require_once( WP_CONTENT_DIR . '/vendor/autoload.php' );
Dacă îl incluzi din directorul temei, va trebui să-l incluzi așa:
require_once( 'vendor/autoload.php' );
Autoload
Pentru a avea un autoload funcțional, va trebui să mai adaugi ceva în composer.json
:
"autoload": { "psr-0": { "foo\\": "includes/", "bar\\": "includes/" } }
De asemenea, va trebui să urmezi câteva reguli foarte simple:
- Un fișier va conține o singură clasă, indiferent cât de mică e clasa (și ar trebui să fie mică! Ba chiar mai mică de atât!);
- Numele fiecărui fișier trebuie să fie același cu numele clasei;
- Numele clasei va trebui scris folosind CamelCase (și nu snake_case);
- Fiecare clasă va folosi Namespaces;
- Fiecare clasă va trebui să urmeze același format și în namespace și în file system
- După adăugarea/ștergerea unui namespace nou în
composer.json
va trebui să rulezicomposer install
Scurt exemplu
<?php // includes\foo\AutoloadedClass.php namespace foo; class AutoloadedClass {} ?>
<?php // includes\bar\baz\AutoloadedClass.php namespace bar\baz; class AutoloadedClass {} ?>
Din functions.php
(și cam de oriunde din temă de fapt), voi putea rula new foo\AutoloadedClass
fără a fi nevoie să fac vreun alt require decât cel menționat mai sus.