может register_post_type () быть безопасно вызван до init

Если я вызову register_post_type() перед действием init , будет ли мой плагин взрываться в огненном шаре при некоторых обстоятельствах? Кодекс говорит :

register_post_type должен вызываться только через действие init. Он не будет работать, если вызывается до «init», а аспекты только что созданного или измененного типа сообщений будут работать некорректно, если их вызывать позже.

Codex также говорит :

Обратите внимание, что вы должны вызвать register_post_type () перед admin_menu и после выполнения действий after_setup_theme. Хорошим крючком для использования является крючок инициализации.

Учитывая этот совет, я всегда регистрировал свой CPT в действии init . Это всегда хорошо срабатывало для меня, до сегодняшнего дня, когда я нашел проблему.

У меня есть плагин (еще не выпущенный в любом месте), который регистрирует электронные письма. Я использую его при тестировании. Он регистрирует CPT, который он использует для хранения журналов электронной почты. Все хорошо до сих пор. Сегодня, тестируя магазин Easy Digital Downloads, я заметил, что я получал ошибки, регистрируемые в debug.log, каждый раз, когда я вставлял новый почтовый журнал. Ошибка вызвана тем, что get_post_type_object() не находит мой CPT, потому что EDD отправляет электронные письма перед действием init .

Итак, после проверки того, что doco и груды других ссылок, включая WPSE, соглашаются, что «register_post_type должен быть вызван только через действие« init », я пошел дальше и изменил свой плагин, чтобы зарегистрироваться на plugins_loaded . Обратите внимание, что это действие предшествует действию after_theme_setup , поэтому я after_theme_setup оба вышеперечисленных фрагмента Codex.

Могу ли я это сделать, или я удалю некоторые проблемы при некоторых обстоятельствах?

BTW, когда я $wp_post_types содержимое $wp_post_types на plugins_loaded , у него уже есть все стандартные типы сообщений WordPress …

Edit: OK, я немой, EDD не отправляет электронные сообщения перед init , мне просто нужно увеличить приоритет моего крюка, чтобы побить его – теперь подключайте init в приоритет 1. Но вопрос все еще стоит …

Solutions Collecting From Web of "может register_post_type () быть безопасно вызван до init"

Короткий ответ: нет. Для канонического примера почему просто взгляните на собственные типы сообщений. Они регистрируются дважды во время загрузки каждой страницы:

  1. Довольно рано из-за соображений обратной совместимости и плагинов, возможно, ожидающих их существования.
  2. На init потому что теперь данные локали загружаются, а определения типа сообщений могут быть правильно переведены.

Так долго ответ – вы можете заставить его работать, но вы находитесь в мире боли и плохой производительности, чтобы это произошло правильно . Только не надо. 🙂