Создание собственного WordPress плагина на основе объектно-ориентированного подхода позволяет не только структурировать код, но и упростить поддержку и масштабирование проекта. В этом материале рассмотрим, как грамотно зарегистрировать кастомный тип записи (Custom Post Type, CPT) в рамках класса и реализовать удаление данных при деинсталляции плагина через uninstall hook.
Регистрация кастомного пост тайпа в ООП-плагине
Для регистрации нового типа записи в WordPress используется функция register_post_type(). В объектно-ориентированном плагине её удобно вызывать внутри публичного метода класса.
Пример минимального метода:
public function custom_post_type() {
register_post_type('property', array(
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'properties'),
'label' => 'Properties',
'supports' => array('title', 'editor', 'thumbnail'),
));
}
Важно: внутри класса не нужно использовать префиксы в именах функций (например,
genius_custom_post_type), поскольку пространство имён ограничено самим классом — конфликта с другими плагинами не произойдёт.
Подключение метода к хуку init
Чтобы WordPress выполнил регистрацию CPT при инициализации, нужно повесить метод на хук init. В ООП-подходе делаем это с помощью статического метода, который собирает все хуки класса:
public static function register_hooks() {
add_action('init', [ new self(), 'custom_post_type' ]);
}
И не забываем вызвать этот метод при инициализации плагина:
MyPlugin::register_hooks();
Проверка регистрации в админке
После активации плагина в админке WordPress появится новый пункт меню Properties.
Созданные записи сохраняются в базе данных и не исчезают после деактивации плагина — только если плагин полностью удаляется.
Реализация uninstall hook
Чтобы при удалении плагина (а не просто при деактивации) WordPress очищал созданные им записи, используем хук register_uninstall_hook().
Этот хук вызывается один раз при полном удалении плагина из админки.
В файле плагина добавляем:
register_uninstall_hook(__FILE__, ['MyPlugin', 'on_uninstall']);
Теперь создаём сам метод on_uninstall, который удалит все записи зарегистрированного типа:
public static function on_uninstall() {
$properties = get_posts([
'post_type' => ['property', 'agent'],
'numberposts' => -1,
]);
foreach ($properties as $property) {
wp_delete_post($property->ID, true);
}
}
get_posts()получает все записи нужного пост тайпа.wp_delete_post()удаляет каждую запись безопасно, без прямых запросов в базу.- Второй параметр
true— принудительное удаление без перемещения в корзину.
Добавление второго пост тайпа — “Агенты”
Если плагин должен хранить не только объекты недвижимости, но и агентов, можно зарегистрировать второй тип записи — agent.
Пример:
public function register_agent_post_type() {
register_post_type('agent', array(
'public' => true,
'rewrite' => array('slug' => 'agents'),
'label' => 'Agents',
'supports' => array('title', 'editor'),
'show_in_rest' => true, // Включаем поддержку Gutenberg
));
}
Добавляем хук аналогично:
add_action('init', [ new self(), 'register_agent_post_type' ]);
Теперь в админке появятся два раздела: Properties и Agents.
Для второго CPT включен редактор Gutenberg (show_in_rest => true), поэтому интерфейс добавления записей будет современным и удобным.
Почему важно использовать uninstall hook
Частая ошибка разработчиков — не удалять данные плагина при его удалении.
В результате база WordPress со временем засоряется “мертвыми” записями и метаданными.
Хук uninstall решает эту проблему:
- гарантирует, что при удалении плагина удаляются все его данные;
- не трогает данные при простой деактивации (например, при обновлении плагина);
- работает только при подтверждённом удалении из интерфейса WordPress.
Ключевые принципы при работе с CPT и хуками
- ООП структура — разделяйте код по методам, избегайте “спагетти” в основном файле.
- Безопасность — используйте функции WordPress (
wp_delete_post,get_posts), а не прямые SQL-запросы. - Чистота базы данных — реализуйте удаление данных через
uninstall hook. - Поддержка Gutenberg — включайте
show_in_rest => trueдля новых типов записей, если планируется использование современного редактора. - Расширяемость — добавляйте новые CPT (например,
agents,locations,reviews) тем же способом, сохраняя общую архитектуру.
Заключение
Благодаря правильной структуре плагина и использованию объектно-ориентированного подхода, ваш код становится:
- читаемым и поддерживаемым,
- безопасным при работе с базой,
- удобным для расширения новыми сущностями.
Такой подход особенно полезен при разработке сложных WordPress-проектов — от каталогов недвижимости до CRM-систем и внутренних панелей управления.