Однією з найкорисніших особливостей сучасних інструментів розробки веб-додатків є те, що вони забезпечують можливість створення дійсно зрозумілих маршрутів — або URL-схем — які є концептуальною картою того, як структуровано додаток.

Наприклад, отримавши деякі дані — скажімо, для персональної сторінки — ви зможете виконати наступні дії:

  • Додати;
  • Оновити;
  • Видалити;
  • І так далі.

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

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

Середньостатистичний користувач, швидше за все, повинен бути знайомий з тим, як змінити URL-схему в панелі WordPress — ми торкнемося цього питання коротко, щоб бути впевненими, що всі розуміють, про що йде мова — проте, для тих, хто розуміє, як генеруються URL-адреси в WordPress, існує набагато більше можливостей.

Насправді, ми можемо задавати правила перезапису посилань, щоб вони відповідали і оброблялися так само, як і в сучасних фреймворках на базі MVC.

Огляд правил перезапису

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

Наприклад, за замовчуванням структура призначення постійних посилань в WordPress виглядає наступним чином:

http://domain.com/?p=123

Цей URL-адреса включає в себе рядок запиту параметра з ключем значення параметра p=123 в системі WordPress, які вказують «вивести посаду з ID 123».

Якщо предметно розглянути параметри в панелі «Налаштування постійних посилань», то тут підтримується безліч різних варіантів:

Інший приклад з правил налаштування, з яким ви певно мали справу, це опція відома як «досить постійні посилання», або, як вони називаються, в панелі управління WordPress, «Заголовок запису».

У цьому форматі URL-адреса виглядає наступним чином:

http://domain.com/post-title/

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

Між цими двома прикладами існує зв’язок, що визначається принципами роботи системи. Вона і демонструє, що ж таке правила перезапису URL-адрес.

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

Природно, тут відразу виникають два питання:

  • Як складаються правила перезапису?
  • І, можливо, що ще більш важливо, чому вони так складні?

Як йдуть справи з правилами перезапису

Причина, по якій правила перезапису можуть створювати деякі проблеми для розробників, полягає в тому, що вони побудовані на стандартних виразах.

Є гарний вислів Джеймі Завински щодо стандартних виразів:

«Деякі люди, зіткнувшись з проблемою, думають: «Я знаю, що для вирішення проблеми треба використовувати стандартні вирази». І тепер у них з’являються відразу дві проблеми».

Забавно, але це дійсно так. І саме тому робота з користувацькими правилами перезапису в WordPress може бути проблемою для багатьох розробників.

На жаль, ми не можемо продемонструвати всі типи і шаблони довільної структури URL-адрес, які можуть бути створені або підтримуються правилами перезапису. Але ми можемо розглянути декілька практичних прикладів, які допоможуть вам зрозуміти, як почати роботу, і закладуть фундамент знань для того, що ми збираємося робити далі.

Очищення правил перезапису

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

Існує два способи, за допомогою яких це можна зробити:

  • Ви можете натиснути кнопку «Зберегти зміни» в панелі «Налаштування постійних посилань». Незважаючи на те, який варіант ви виберете, в будь-якому випадку всі зміни відображаються у файлі functions.php;
  • Ви можете викликати функцію $wp_rewrite->flush_rules(); і вирішити проблему програмно.
  • Незалежно від способу, який ви виберете, важливо пам’ятати цей момент, тому що кожен раз, коли ви ставите нові правила перезапису, потрібно очистити старий набір правил.

    Як працюють функції перезапису?

    Коли справа доходить власне до створення своїх правил перезапису, важливо розуміти, як працюють функції перезапису.

    Весь процес можна умовно розділити на чотири етапи:

    • Запит URL-адреси з веб-сервера;
    • Якщо контент існує запитаному URL-адресою, то він буде виведений (це може бути зображення, шрифт або що-небудь ще);
    • Якщо контент не існує, то запит буде направлений до файлу index.php, який відповідає шаблону URL-адреси;
    • Потім вміст видається з WordPress клієнту.

    Якщо вам цікаво ближче познайомитися з правилами перезапису, які встановлюються на основі налаштувань розділу «Постійні посилання» в панелі адміністрування, ви можете спробувати плагін Rewrite Rules Inspector.

    Цей плагін буде показувати список правил, які в даний час відповідають конкретній URL-схемою. Разом зі стандартними виразами і суміщеними змінними для index.php:

    Використання WordPress для розробки веб-додатків: перезапис URL-адрес

    Вловлюєте думка? Якщо ні, то давайте розглянемо декілька простих, практичних прикладів.

    Приклад правил перезапису

    Враховуючи, що шаблони розпізнаються і передаються через файл index.phpми можемо скористатися функцією add_rewrite_rule, щоб визначити, як будуть працювати наші користувача URL-адреси.

    Коротка назва для ID запису

    Давайте припустимо, що ми розглядаємо перший пост в системі — тобто, ми розглядаємо запис з ID 1.

    У більшості щойно встановлених систем WordPress, це «Привіт, світ», та URL-адреса цього запису виглядає наступним чином http://domain.com/hello-world або http://domain.com/?p=1 залежно від налаштування постійних посилань (тобто, поточного набору правила перезапису).

    Але давайте поставимо правило, згідно з яким з адреси http://domain.com/first також буде завантажуватися перше повідомлення в базі даних:

    function example_add_rewrite_rules() {
    add_rewrite_rule( ‘first’, ‘index.php?p=1’, ‘top’ );
    flush_rewrite_rules();
    }
    add_action( ‘init’, ‘example_add_rewrite_rules’ );

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

    А саме, http://domain.com/?p=2:

    function example_add_rewrite_rules() {
    add_rewrite_rule( ‘first’, ‘index.php?p=1’, ‘top’ );
    add_rewrite_rule( ‘second’, ‘index.php?p=2’, ‘top’ );
    flush_rewrite_rules();
    }
    add_action( ‘init’, ‘example_add_rewrite_rules’ );

    Якщо ви ознайомилися з документацією по add_rewrite rule, то це цілком зрозуміло, чи не так?

    Коротше кажучи, функція приймає три аргументи:

    • Перший аргумент є стандартним виразом, відповідним запитуваній URL-адресою. У нашому випадку ми використовуємо прості слова;
    • Другим аргументом є сам URL-адресу, який ми запитуємо. Знову ж, у нашому випадку ми отримуємо першу і другу запис відповідно;
    • І, нарешті, останнім аргументом є пріоритет, який може приймати значення «top» або «bottom«. Якщо встановлено значення «top«, то це правило буде мати більш високий пріоритет у порівнянні з іншими. Але, якщо «bottom«, тоді воно буде мати нижчий пріоритет.

    Це загальні приклади. Їх недостатньо, щоб детально показати вам, як настроїти маршрути, як ті, що ми описали вище. Для цього слід розглянути більш складні вирази.

    Примітки до запитуваною правилами перезапису

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

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

    У будь-якому випадку переконайтеся, що функції підключені правильно, щоб перезапис правил не запускалася при завантаженні кожної сторінки — тільки при зміні самих правил.

    Більш складний підхід до правил перезапису

    Для того щоб ввести більш складний набір правил перезапису, на зразок тих, що ми описували раніше при розгляді операцій CRUD, важливо розуміти наступні дві функції:

    • add_rewrite_tag повідомить WordPress про користувальницьких змінних рядків запитів. Вона використовується в поєднанні з іншою функцією;
    • add_rewrite_rule, як вже згадувалося, вона дозволить нам додати додаткові правила перезапису для WordPress (а також встановити їх пріоритет).

    Тепер, припустимо, що у нас є записи типу під назвою «Персональна сторінка», що представляє дані користувача програми.

    І, припустимо, що для персональної сторінки також задані наступні методи та відповідні їм схеми URL-адрес:

    all: http://domain.com/individuals/;
    update: http://domain.com/individual/update/1, який використовується для оновлення від першої особи;
    delete: http://domain.com/individual/delete/1, який використовується для видалення від першої особи.

    Таким чином, схема теоретично досить проста, але як нам реалізувати її на практиці?

    По-перше, ми повинні визначити правила перезапису:

    function example_add_rewrite_rules() {
    // Задаємо тег ID персональної сторінки
    add_rewrite_tag( ‘%individual_id%’, ‘([0-9]*)’ );
    // Задаємо правила перезапису для кожної людини
    add_rewrite_rule( ‘^individual/update/([0-9]*)’, ‘index.php?individual=update&individual_id=$matches[1]’, ‘top’ );
    add_rewrite_rule( ‘^individual/delete/([0-9]*)’, ‘index.php?individual=delete&individual_id=$matches[1]’, ‘top’ );
    }
    add_action( ‘init’, ‘example_add_rewrite_rules’ );

    Далі, нам необхідно визначити ці користувальницькі функції для кожної людини, так щоб при їх виклик оновлювалися відповідні записи в базі даних.

    У цьому випадку ми визначаємо дві функції — одна для поновлення персональних сторінок, друга — для їх видалення.

    Представлений код також припускає, що необхідна інформація буде міститися в запитуваній адресу, який буде передаватися через браузер.

    Зокрема, потрібно, щоб для оновлення персональної сторінки ID, ім’я, прізвище, і інша інформація були відправлені у відповідній формі:

    function example_process_individual( $input ) {
    if ( example_updating_user() ) {
    example_update_individual( $input );
    } else if ( ‘true’ == $input[‘delete_individual’] ) {
    example_delete_individual( $input[‘individual_id’] );
    }
    }
    if( ! is_admin() ) add_action( ‘init’, ‘example_process_individual’ );
    function example_update_individual( $input ) {
    /* Вхідний набір $input необхідної форми,
    * яка використовується для оновлення користувача.
    *
    * Він може містити такі дані, як ID, ім’я,
    * прізвище і т. д.
    *
    * У разі якщо все вірно, використовується wp_redirect
    * для переходу тому на домашню сторінку, або ж перезавантаження
    * сторінки і виведення повідомлення про помилку.
    */
    }
    function example_delete_individual( $individual_id ) {
    /* Використовується вхідний ID для знаходження запису персональної сторінки
    * і видалення її з бази даних.
    *
    * У разі якщо все вірно, використовується wp_redirect
    * для переходу тому на домашню сторінку, або ж перезавантаження
    * сторінки і виведення повідомлення про помилку.
    */
    }
    function example_updating_user() {
    return 0 == strpos( $_SERVER[‘REQUEST_URI’], ‘/individual/update’ );
    }
    function example_deleting_user() {
    return 0 == strpos( $_SERVER[‘REQUEST_URI’], ‘/individual/delete’ );
    }

    Зверніть увагу, що перша функція пов’язана з дією init і запускається тільки, якщо користувач не ввійшов у систему під логіном адміністратора.

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

    Також ознайомтеся з кодом коментарів для функцій Update і Delete , щоб зрозуміти, як вони повинні працювати.

    І, нарешті, відзначимо, що останні дві функції є суто допоміжними і призначені для того, щоб зробити код функції, пов’язаної з ініціалізацією, більш чистим.

    Це, звичайно, не всі

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

    Правда, це дійсно складна тема, і краще всього вивчати дане питання, на практиці робота з конкретними завданнями.

    Тим не менш, це важливий компонент додатків WordPress, який дозволяє системі служити основою для розробки веб-додатків.

    Що далі?

    Після всього, про що я вам розповів, пора вже переходити до теми кешування.

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

    З урахуванням усього вище сказаного, в наступній статті ми приділимо нашу увагу функцій тимчасового зберігання, які допоможуть вам створити власний вбудований рівень кешування, а також розглянемо, як сторонні механізми кешування можуть допомогти нам зробити додатки швидше.

    Переклад статті «Using For WordPress Web Application Development: Features Available, Part 6: URL Rewriting (or Routes)» був підготовлений дружною командою проекту Сайтостроение від А до Я.