flush_rewrite_rules()
Оновлює правила перезапису ЧПУ: видаляє наявні, генерує та записує нові.
Ця функція корисна під час реєстрації нових типів записів, оскільки вона дозволяє автоматично скидати правила перезапису ЧПК. Зазвичай це робиться вручну.
Якщо ви створили новий тип запису за допомогою функції register_post_type() , потім створили новий запис цього типу, і при заході на неї побачили помилку 404, то правила перезапису ЧПУ не були скинуті.
Так відбувається тому, що нові правила перезапису (зберігаються в БД) не були створені. Щоб створити потрібна ця функція.
Вручну скинути правила перезапису ЧПУ можна через сторінку “Постійні посилання” (Permalinks). Під час відвідування цієї сторінки правила перезапису видаляються з бази даних, генеруються нові та зберігаються на місце колишніх.
У старих версіях WP на цій сторінці потрібно ще натиснути кнопку Зберегти.
Скидати правила перезапису необхідно лише один раз, тому що це ресурсомістка операція. Скидати правила можна при активації, деактивації, видаленні плагіна або інших випадках, коли ви точно знаєте що це потрібно зробити. Не потрібно використовувати функцію щоразу під час створення сторінки! Не потрібно вішати цю функцію на хук init
, крім випадків, коли ви знаєте, що робите.
Скидати правила перезапису потрібно на хуку wp_loaded .
Технічно ця функція перепризначає виклик змий себе, якщо вона викликана раніше. Але іноді таке перепризначення може викликати баги, тому краще відразу викликати функцію на хуку wp_loaded .
Також для скидання можна обнулити опцію rewrite_rules
(у ній зберігаються правила ЧПУ).
update_option( 'rewrite_rules', '');
При наступній генерації сторінки опція буде створена автоматично. wp_rewrite_rules () . При цьому базові правила ЧПУ будуть отримані одразу за потребою, а також буде створено подію на перегенерацію на хуку wp_loaded , щоб ще раз правильно оновити ЧПК.
WP_Rewrite::flush_rules()
(гальмо) | 50000 разів – 196.39 сек
(гальмо) |
PHP 7.1.11, WP 4.9.8
Хуків немає.
Повертає
null
. Нічого не вертає.
Використання
flush_rewrite_rules($hard);
-
$hard
(логічний) -
Чи потрібно оновлювати файл
.htaccess
, чи просто оновити правила. За промовчанням – true, оновлюється файл .htaccess.
Типово: true
Приклади
#1 Скидання ЧПУ при активації/деактивації плагіна
Наприклад, показує, як скидати правила перезапису ЧПУ в момент активації/деактивації плагіна:
function myplugin_activate() { // Тут, робимо що потрібно при активації плагіна flush_rewrite_rules(); } register_activation_hook( __FILE__, 'myplugin_activate'); function myplugin_deactivate() { flush_rewrite_rules(); } register_deactivation_hook( __FILE__, 'myplugin_deactivate');
#2 Скидання ЧПУ при активації/деактивації теми
Наприклад, показує, як скидати правила перезапису ЧПУ в момент активації теми:
/* Скидаємо правила для довільного типу записів. */ add_action( 'after_switch_theme', 'bt_flush_rewrite_rules'); function bt_flush_rewrite_rules() { flush_rewrite_rules(); }
#3 Скидання ЧПК, якщо файл був змінений або кожні 48 годин
Якщо ви розробляєте тему, то на час розробки може стати в нагоді такий код, який скидатиме правила перезапису ЧПУ, якщо файл був змінений або кожні 48 годин.
// Do not use on live/production servers add_action('init','maybe_rewrite_rules'); function maybe_rewrite_rules() { // Отримаємо час файлу як номер версії $ver = filemtime( __FILE__ ); $defaults = array( 'version' => 0, 'time' => time() ); $r = wp_parse_args( get_option( __CLASS__ . '_flush', array() ), $defaults ); // Скидаємо якщо змінилася версія, якщо минуло 48 годин. if ( $r['version'] != $ver || $r['time'] + 172800 < time() ) { flush_rewrite_rules(); $args = array( 'version' => $ver, 'time' => time() ); if ( ! update_option( __CLASS__ . '_flush', $args ) ) add_option( __CLASS__ . '_flush', $ args ); } }
нотатки
- Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
список змін
З версії 3.0.0 | Введено. |
Код flush_rewrite_rules() flush rewrite rules WP 6.0.2
function flush_rewrite_rules( $hard = true ) { global $wp_rewrite; if ( is_callable( array( $wp_rewrite, 'flush_rules' ) ) ) ) { $wp_rewrite->flush_rules( $hard ); } }