Вопрос или проблема
Я учусь регистрировать пользовательский тип записи с помощью плагина, но запутался. Вот мои вопросы:
- Я деактивировал свой плагин и сбросил правило перезаписи в хуке деактивации. Тем не менее, я все еще могу заходить на архив типов записей и одиночные страницы, почему я не получаю ошибку 404? Я искал в Google и даже спрашивал ИИ, и получил следующий ответ: “WordPress не сохраняет определения CPT в базе данных, вместо этого они остаются в памяти.” Также это работает только когда я вручную сохраняю постоянную ссылку после деактивации плагина, или мне нужно отменить регистрацию типа записи в хуке деактивации перед сбросом. Почему так? Сохранение постоянной ссылки также отменяет регистрацию типа записи? Я также пытался очистить память вручную, используя gc_collect_cycles() в хуке деактивации. Все равно не работает!!!
Итак, может кто-то прояснить мне это?
Ответ или решение
WordPress сохраняет определения настраиваемых типов записей (Custom Post Types, CPT) в памяти, а не в базе данных. Это означает, что когда вы регистрируете CPT через свой плагин, он загружается и сохраняется в памяти сервера. При деактивации плагина, вы можете ожидать, что все, что было зарегистрировано, будет удалено, однако, в реальности, состояние этого типа записи может сохраняться до следующего запроса.
Почему вы не получаете ошибку 404 после деактивации плагина?
Когда вы деактивируете плагин, а затем сбрасываете правила перезаписи (flush rewrite rules) в хуке deactivation
, вы можете столкнуться с такой ситуацией, когда ваше настраиваемое отображение CPT все еще доступно. Это происходит по следующим причинам:
-
Кэширование правил перезаписи: Правила перезаписи кэшируются в базе данных. Во время сброса перезаписи WordPress обновляет их, но если CPT не зарегистрирован, он по-прежнему может иметь условия, при которых его URL-адреса остаются актуальными до следующего запроса.
-
Действие сохранения постоянных ссылок: Когда вы вручную сохраняете настройки постоянных ссылок, WordPress регистрирует все доступные CPT в текущем запросе. Это также может заново активировать кэшированные правила, что вводит в заблуждение.
-
Отсутствие стандартного отката на уровне памяти: Память, в которой хранятся зарегистрированные CPT, не очищается автоматически. Это происходит потому, что PHP не предоставляет механизм автоматического уничтожения определений глобальных функций или классов, которые были зарегистрированы при активации плагина.
Как корректно деактивировать CPT?
Если вы хотите корректно удалить настраиваемый тип записи во время деактивации плагина, необходимо выполнить несколько шагов:
-
Удаление определения CPT: Вы можете использовать функцию
unregister_post_type()
в хукеdeactivation
. Это позволяет явно удалить регистрацию тип записи, чтобы избежать кэширования в памяти.function my_plugin_deactivate() { unregister_post_type( 'my_custom_post_type' ); flush_rewrite_rules(); } register_deactivation_hook( __FILE__, 'my_plugin_deactivate' );
-
Сброс правил перезаписи: Сбросить правила перезаписи после удаления CPT для гарантии, что система полностью обновлена.
Заключение
Чтобы избежать путаницы с настраиваемыми типами записей в WordPress, помните о том, что они хранятся временно в памяти. Деактивация плагина и сброс правил перезаписи не всегда гарантирует полное удаление. Регистрация и удаление CPT требует четкого управления состоянием и понимания, как работает система кэширования в WordPress. Таким образом, для правильного функционирования всегда старайтесь акцентировать внимание на явном удалении ваших пользовательских типов записей перед сбросом правил перезаписи.