Intereting Posts
Когда использовать Исключения против Объектов Ошибок против простого ложного / нулевого Изменение адреса сайта (URL) вызывает 404 Самый эффективный способ для структуры URL html Как скрыть пункт меню, созданный темой в панели администратора WordPress? шаблон продукта woocommerce дополнительно настраиваемое поле под описанием продукта Metabox не отображается на пользовательском типе сообщений, но на страницах и сообщениях WP_Filesystem в пользовательском настройке управления Переписать правило, не проходящее переменную Ошибка 404 в каталоге wp-includes Сепаратор для пользовательского навигационного меню GravityForms Ограничение подачи в период времени пользователем или IP на 30 минут? Как регистрировать строки (ресурс) из пользовательской таблицы в виде сообщений пользовательского типа «на лету»? Любой плагин или скрипт для интеграции модуля выбора ajax на страницу WordPress Как отображать категории продуктов на главной странице? Мой wp-admin перестает работать внезапно

Лучший способ flush_rewrite_rules для пользовательского типа сообщений в плагине mu-plugins?

Я пишу плагин, который создает экземпляр настраиваемого типа сообщений (между прочим). Это многопользовательский плагин и живет в каталоге mu-plugins .

Какова наилучшая практика для обработки flush_rewrite_rules () в этой ситуации? Для «нормального» плагина вы сделали бы это с помощью активационного крючка, который не будет доступен для плагина с обязательным использованием, поскольку эти перехватчики недоступны.

Поскольку это событие должно быть «одноразовым» после регистрации пользовательского типа сообщения, имеет ли смысл делать что-то подобное в моем классе, которое регистрирует CPT:

private function check_flush_my_CPT() { global $wp_rewrite; if ( !get_option('my_plugin_firstrun') ) { $wp_rewrite->init(); $wp_rewrite->flush_rules(true); update_option('my_plugin_firstrun', 'yes'); } } public function register_my_CPT() { // do all the CPT setup steps for the $args array... register_post_type('my_CPT', $args); $this->check_flush_my_CPT(); } add_action( 'init', array(&$this, 'register_my_CPT' ) ); 

Таким образом, регистрация CPT происходит при каждом действии init, но если у меня это право, правила перезаписывания выполняются только один раз. Когда-либо .

Я на правильном пути?

(изменить): Я просто попробовал; мой CPT дает ошибку 404, не найденную, поэтому правила перезаписи не работают 🙁

(edit # 2): Я попробовал решение для доступа к глобальной переменной, как показано в этом вопросе: Как надежно сбросить правила перезаписи на многопользовательском? – Я покажу пример моего кода выше, чтобы показать это. К сожалению, я все еще получаю ошибку 404 при попытке загрузить CPT. Я вижу, что правила перезаписи хранятся в базе данных, кажется, что они не используются. Я потерялся.

Функция flush_rewrite_rules является надежной в некоторых контекстах, таких как тема или плагин на основе перехватов, но я не уверен, что она работает для mu-plugin

Мое утверждение основано на том, что WordPress инициализируется следующим образом:

  • вызовите файл wp-settings.php
  • вызовите do_action( 'muplugins_loaded' ); hook, здесь ваш плагин инициализирован
  • вызов $GLOBALS['wp_rewrite'] = new WP_Rewrite(); здесь метод flush_rules инициализируется и доступен с этого flush_rules
  • do_action( 'setup_theme' ); и я поставил все свои деньги, что на этом крюке будут работать flush_rewrite_rules

Решение?

Лично я нахожу надежным удаление опции rewrite_rules.

 delete_option('rewrite_rules'); 

или

 update_option('rewrite_rules', '' ); 

Всякий раз, когда WordPress не будет иметь rewrite_rules он вернет их обратно, это также flush_rules метод flush_rules .

Есть точки в потоке выполнения WordPress, где такие функции недоступны. даже в ядре WordPress я нашел это утверждение

 // Rewrite rules can't be flushed during switch to blog. delete_option( 'rewrite_rules' ); 

Единственной проблемой будет производительность, не делайте этого при каждом запросе, потому что это сложный процесс для их восстановления. Как я вижу, вы хотите сбросить их только при первом вызове, и это хорошо.

PS: Я не такой самопромоутер, но я тоже написал статью об этом давным-давно, и я думаю, что это все еще стоит за этим

Если у вашего mu-plugin есть опции, я бы поставил флеш сразу после их обновления:

 update_option( 'my_options', $values ); // Flush rules after install flush_rewrite_rules();