PHP
#wordpress#php#functions-php#theme#oop#bootstrap

WordPress: загрузка inc-модулей из functions.php (OOP)

Точка входа темы: загрузка inc/cpt.php, inc/taxonomies.php, inc/meta.php без захламления functions.php. Рекомендация из документации WordPress.

Как использовать

  1. Создайте в теме папку inc/ и файлы cpt.php, taxonomies.php, meta.php (или свои).
  2. В functions.php оставьте только вызов ThemeBootstrap::load() (и при необходимости регистрацию класса).
  3. В 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.