Плавный переход на ООП
Не переписывай всё сразу. Двигайся поэтапно:
Шаг 1 — Добавь composer.json с PSR-4 autoload, создай папку src/
Шаг 2 — Возьми одну фичу (например, шорткод) и вынеси в класс. Всё остальное пусть остаётся процедурным
Шаг 3 — Следующая фича — ещё один класс. И так по одному
Шаг 4 — Когда классов станет 5+, появится понимание, что у них есть общее — тогда сделай интерфейс или базовый класс
Частые ошибки
“Классы ради классов” — класс с одним методом, который вызывается один раз. Это не ООП, это лишний файл. Если функции достаточно — оставь функцию.
Наследование ради наследования — class Dog extends Animal extends LivingThing. В реальности наследование нужно редко. В WordPress чаще всего хватает интерфейса.
Слишком раннее абстрагирование — не пиши “универсальный фреймворк” на первом плагине. Сначала напиши 2-3 плагина с дублированием, потом увидишь что реально повторяется и вынесешь.
Паттерны ради паттернов — не нужен Factory, Strategy, Observer на каждый чих. Начни с группировки функций в классы — уже 80% пользы.
Конфигурацию — отдельно от логики
Вместо хардкода полей внутри класса:
// Плохо — мешаем данные и логику
class MyMetabox {
public function register() {
add_meta_box(...);
}
public function render() {
echo '<input name="field_1" ...>'; // захардкожено
echo '<input name="field_2" ...>';
echo '<select name="field_3" ...>';
}
}
Правильно так:
// Хорошо — конфигурация отдельно
// config/post-metabox.php
return [
['name' => 'field_1', 'type' => 'text', 'title' => 'Заголовок'],
['name' => 'field_2', 'type' => 'checkbox', 'title' => 'Скрыть'],
];
// src/MyMetabox.php
class MyMetabox {
public function __construct(private array $fields) {}
public function render() {
foreach ($this->fields as $field) {
// универсальный рендер по типу
}
}
}
// plugin.php
new MyMetabox(include __DIR__ . '/config/post-metabox.php');
Добавить новое поле = добавить строку в массив, не трогая PHP-класс.