WordPress: регистрация CPT и таксономии (OOP, PHP 8.1+)
Класс для регистрации произвольного типа записи и таксономии в хуке init. Опирается на register_post_type() и register_taxonomy().
Как использовать
- Скопируйте класс в плагин или inc/cpt.php темы.
- В init вызовите ProjectPostType::register() (или инициализируйте класс и зарегистрируйте хуки в конструкторе).
- При смене темы вынесите регистрацию в плагин/mu-plugin — иначе тип пропадёт из админки (данные в БД останутся).
Регистрация CPT и таксономии в одном классе, без размазывания по functions.php. Документация: register_post_type(), register_taxonomy(), wp-kama.ru: register_post_type.
<?php
declare(strict_types=1);
/**
* Регистрация CPT "project" и таксономии "project_type".
* Подключать на хук init. PHP 8.1+.
*/
final class ProjectPostType
{
private const POST_TYPE = 'project';
private const TAXONOMY = 'project_type';
public static function register(): void
{
$self = new self();
add_action('init', [$self, 'registerPostType']);
add_action('init', [$self, 'registerTaxonomy']);
}
public function registerPostType(): void
{
register_post_type(self::POST_TYPE, [
'label' => 'Проекты',
'public' => true,
'has_archive' => true,
'rewrite' => ['slug' => 'projects'],
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);
}
public function registerTaxonomy(): void
{
register_taxonomy(self::TAXONOMY, [self::POST_TYPE], [
'label' => 'Тип проекта',
'hierarchical' => true,
'show_in_rest' => true,
]);
}
}
// В плагине или functions.php (лучше в плагине):
add_action('init', [ProjectPostType::class, 'register'], 5);
Usage:
Подключите файл из functions.php или плагина и вызовите ProjectPostType::register() на init. Для сброса постоянных ссылок после первого включения: в админке «Настройки → Постоянные ссылки» нажмите «Сохранить».
Notes:
- Таксономию нужно регистрировать отдельным вызовом на
init; связь с CPT задаётся вторым аргументомregister_taxonomy()— массив типов записей. - Если CPT регистрируется в теме, при смене темы он исчезнет из админки; данные в БД сохранятся. Для продакшена лучше выносить в mu-plugin или плагин (см. статью «Сущности WordPress, свои поля и роль functions.php»).