PHP
#wordpress#php#custom-post-type#taxonomy#oop#php81

WordPress: регистрация CPT и таксономии (OOP, PHP 8.1+)

Класс для регистрации произвольного типа записи и таксономии в хуке init. Опирается на register_post_type() и register_taxonomy().

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

  1. Скопируйте класс в плагин или inc/cpt.php темы.
  2. В init вызовите ProjectPostType::register() (или инициализируйте класс и зарегистрируйте хуки в конструкторе).
  3. При смене темы вынесите регистрацию в плагин/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»).