WordPress: загрузка inc-модулей из functions.php (OOP)
Точка входа темы: загрузка inc/cpt.php, inc/taxonomies.php, inc/meta.php без захламления functions.php. Рекомендация из документации WordPress.
Как использовать
- Создайте в теме папку inc/ и файлы cpt.php, taxonomies.php, meta.php (или свои).
- В functions.php оставьте только вызов ThemeBootstrap::load() (и при необходимости регистрацию класса).
- В inc-файлах вешайте хуки и регистрируйте CPT/метабоксы; в functions.php — только подключение.
Минимальный functions.php: подключает модули из inc/, не держит логику. Соответствует подходу «functions.php — bootstrap, а не помойка» из статьи про сущности WordPress и role functions.php.
<?php
declare(strict_types=1);
/**
* Загрузка inc-модулей темы. PHP 8.0+.
* Пути относительно директории темы.
*/
final class ThemeBootstrap
{
private const INC_FILES = [
'inc/cpt.php',
'inc/taxonomies.php',
'inc/meta.php',
];
public static function load(): void
{
$dir = get_stylesheet_directory();
foreach (self::INC_FILES as $file) {
$path = $dir . '/' . $file;
if (is_readable($path)) {
require_once $path;
}
}
}
}
// functions.php темы — только это и (при необходимости) автозагруз класса:
ThemeBootstrap::load();
Структура темы:
theme/
├── functions.php → только ThemeBootstrap::load()
├── inc/
│ ├── cpt.php → регистрация CPT (или вызов ProjectPostType::register())
│ ├── taxonomies.php → регистрация таксономий
│ └── meta.php → метабоксы и save (или вызов ProjectRepoMetaBox::init())
Usage:
В каждом файле из inc/ используйте add_action('init', ...) и т.п.; не выводите HTML из require. Если классы лежат в том же файле или подгружаются через composer — вызовите их инициализацию в конце соответствующего inc-файла.
Notes:
- CPT и таксономии, зарегистрированные в теме, пропадут из админки при смене темы. Для долгоживущих проектов выносите регистрацию в плагин или mu-plugin.