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

9

Я пишу плагин, который создает пользовательский тип сообщения (среди прочего). Это многосайтовый плагин и живет в каталоге 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. Я вижу, что правила перезаписи хранятся в базе данных, просто кажется, что они не используются. Я потерялся.

CC
источник
Там действительно нет правильного способа сделать это. Это в основном лучшее на момент написания этого комментария.
Питер Гусен
@PieterGoosen - спасибо, я видел это раньше и обновил свой вопрос, чтобы рассмотреть другое решение. Все еще не работает. Интересно, я что-то сломал, выполнив flush_rewrite_rules () перед тем, как увидеть другой ответ? Может быть, я должен удалить свой тестовый сайт и восстановить его, чтобы точно проверить правильность процедуры?
ЦК
Это может быть возможно. Неправильное выполнение правил перезаписи на мультисайтах может привести к нарушению всех правил перезаписи в вашей сети. Если бы я был там, где ты, я бы просто начал все заново. Просто надеюсь, что это локальный конец установки, а не живой сайт ;-)
Питер Гусен
Хорошо ... Я попробую это. И нет, это тестовый сайт, и я думаю, что теперь я могу стереть БД и переустановить конфигурацию сети во сне! :-)
CC

Ответы:

2

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.

delete_option('rewrite_rules');

или

update_option('rewrite_rules', '' );

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

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

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

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

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

Андрей
источник
0

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

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Леон Фрэнсис Шелхамер
источник