Найкращий спосіб flush_rewrite_rules для користувацького типу публікації у плагіні mu-plugins?


9

Я пишу плагін, який створює спеціальний тип публікації (серед іншого). Це багатопрофільний плагін і живе в каталозі mu-плагінів .

Яка найкраща практика поводження з 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 не знайдено, тому правила переписування не працюють :-(

(редагування №2): Я спробував рішення для доступу до глобальної змінної, як показано в цьому запитанні: Як надійно очистити правила перезапису на багатосайт? - Я оновлю приклад коду вище, щоб це показати. На жаль, я все ще отримую помилку 404 при спробі завантажити CPT. Я бачу, що правила перезапису зберігаються в базі даних, просто здається, що вони не використовуються. Я загубився.



Насправді немає правильного способу зробити це. Це в основному найкраще на момент написання цього коментаря.
Пітер Гусен

@PieterGoosen - дякую, я це бачив раніше, і я оновив своє питання, щоб розглянути інше рішення. Ще не працює. Цікаво, чи зламав я щось, виконавши flush_rewrite_rules (), перш ніж побачити іншу відповідь? Можливо, мені доведеться видалити свій тестовий сайт і відновити його, щоб точно перевірити правильну процедуру?
КК

Це можливо. Виконання правил перезапису флеш-помилок у мультисайті може порушити всі правила перезапису у вашій мережі. Якби я там, де ти, я просто почав би бути свіжим. Просто сподіваюсь, що це локальна інсталяція, а не живий сайт ;-)
Pieter Goosen

правильно ... я спробую це. І ні, це тестовий сайт, і я думаю, що я можу знищити БД і знову встановити мережеву конфігурацію уві сні! :-)
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

Якщо у вашого му-плагіна є варіанти, я ставлю флеш відразу після оновлення:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.