Я пишу плагин, который создает пользовательский тип сообщения (среди прочего). Это многосайтовый плагин и живет в каталоге 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 not found, поэтому правила перезаписи не работают :-(
(правка № 2): я попробовал решение для доступа к глобальной переменной, как показано в этом вопросе: как надежно очистить правила перезаписи на мультисайтах? - Я обновлю мой пример кода выше, чтобы показать это. К сожалению, я все еще получаю ошибку 404 при попытке загрузить CPT. Я вижу, что правила перезаписи хранятся в базе данных, просто кажется, что они не используются. Я потерялся.
Ответы:
flush_rewrite_rules
Функция надежна в некоторых контекстах как тема или плагин на основе крючков , но я не уверен , если это работает дляmu-plugin
Мое утверждение основано на том факте, что WordPress инициализируется следующим образом:
wp-settings.php
файлdo_action( 'muplugins_loaded' );
, здесь ваш плагин инициализирован$GLOBALS['wp_rewrite'] = new WP_Rewrite();
здесь методflush_rules
инициализирован и теперь доступенdo_action( 'setup_theme' );
называется, и я поставил все свои деньги, что на этом крюкеflush_rewrite_rules
будет работатьРешение?
Лично я считаю надежным удаление опции rewrite_rules.
или
Всякий раз, когда WordPress будет не хватать,
rewrite_rules
он будет собирать их обратно, это также делаетflush_rules
метод.В потоке выполнения WordPress есть точки, в которых подобные функции недоступны. даже в ядре WordPress я нашел это утверждение
Единственная проблема - производительность, не делайте этого при каждом запросе, потому что это сложный процесс для их восстановления. Как я вижу, вы хотите сбросить их только при первом вызове, и это хорошо.
PS: я не такой фанат саморекламы, но я также написал статью об этом давным-давно, и я думаю, что это все еще стоит
источник
Если у вашего mu-плагина есть опции, я бы поставил их сразу после обновления:
источник