Управління створенням правил перезапису URL в плагінах WordPress

У WordPress входить група функцій, які дозволяють визначати власну структуру URL. До них відносяться add_rewrite_rule () , add_rewrite_tag () , flush_rules () і т.п. Використання цих функцій досить докладно описано в документації, але у движка є особливості, які можуть привести до несподіваних проблем.

У більшості випадків додаткові правила перезапису URL створюються в плагінах. Наприклад, якщо вам необхідно на основі якогось параметра змінювати параметри запиту до бази даних.

Для того, щоб додати правило потрібно:

1) Викликати функцію add_rewrite_rule і передати їй регулярний вираз для розбору параметрів.

function add_my_rules () {add_rewrite_rule ( 'my_param / (\ d +)? $', 'index.php? my_param = $ matches [1]', 'top'); }

2) Додати нову змінну в об'єкт WP_Query . Для цього використовується фільтр query_vars.

add_filter ( 'query_vars', 'add_query_vars'); function add_query_vars ($ vars) {$ vars [] = 'my_param'; return $ vars; }

У першому параметрі функція add_query_vars отримає масив з усіма змінними WP_Query і ми зможемо додати в цей масив ім'я нашого параметра (my_param).

Після цього можна отримати значення параметра за допомогою get_query_var (). наприклад,

$ My_param_value = get_query_var ( 'my_param'); ...

Тобто ми зможемо використовувати отримане значення, наприклад, при вибірці постів (в обробнику події pre_get_posts) або прямо в шаблонах теми. Тут можливості обмежені тільки вашою фантазією і завданнями.

Залишається тільки одне питання: «Коли викликати add_my_rules?»

Якщо правила додаються в плагіні, то логічно для цих цілей використовувати події активації і деактивації. Тобто зробити щось на кшталт:

register_activation_hook (__FILE__, 'my_plugin_setup'); function my_plugin_setup () {add_my_rules (); flush_rewrite_rules (); } Register_deactivation_hook (__FILE__, 'deactivate'); function deactivate () {flush_rewrite_rules (); }

В результаті все буде працювати, тому що при активації плагіна правила додаються, а при деактивації - відбувається перезапис правил, без виклику функції add_rewrite_rules, тобто без нових правил.

Проблема в тому, що будь-який виклик flush_rewrite_rules () буде відключати нові правила. Тобто, наприклад, при вході на сторінку налаштувань постійних посилань правила будуть відключені.

Зверніть увагу. Для підвищення продуктивності WP кешируєт правила. Тому для того, щоб перезаписати правила обов'язково потрібно викликати flush_rewrite_rules (скидає кеш). При цьому, flush_rewrite_rules може викликатися самим двигуном (наприклад, при збереженні ЧПУ) і може викликатися іншими плагінами.

Рішення.

Очевидно, що register_activation_hook для установки правил не підходить, тому що викликається тільки один раз при активації плагіна. Нам потрібно використовувати подія, яке виникає при кожному пересоздании правил.

Змінимо наш код наступним чином.

Прибираємо виклик add_my_rules з register_activation_hook і додаємо обробник події generate_rewrite_rules

add_action ( 'generate_rewrite_rules', 'add_my_rules');

Тепер правила залишаються активними при викликах flush_rewrite_rules, але вони не видаляються при деактивації плагіна. Відбувається це тому, що при кожному виклику flush_rewrite_rules, не залежно від того хто цей виклик зробив, відбувається додавання наших правил.

Виправити проблему можна наступним чином.

додаємо змінну

$ Is_deactivating = false;

встановлюємо її рівною true при виклику deactivate

function deactivate () {$ this-> is_deactivating = true; flush_rewrite_rules (); }

і додаємо перевірку при установці правила

function add_my_rules () {if ($ this-> is_deactivating === false) {add_rewrite_rule ( 'my_param / (\ d +)? $', 'index.php? my_param = $ matches [1]', 'top'); }}

Тепер при деактивації плагіну буде перевірятися значення змінної $ is_deactivating і якщо воно дорівнює true, то наші правила додаватися не будуть.

Як бачите, рішення досить просте, але за умови, що ви розумієте, як працює движок. Пам'ятати про всі нюанси дуже складно, але є загальне правило - якщо ви використовуєте вбудовані можливості WP, в першу чергу шукайте відповідні події.

Успіхів!

Function add_my_rules () {add_rewrite_rule ( 'my_param / (\ d +)?
Php?
Php?

Дополнительная информация

rss
Карта