WordPress POST запити: обробка

389

Від автора: доброго інтерактивного сайту необхідно взаємодіяти з даними, які вводить користувач. Дані вводяться в спеціальних формах, які є частиною виду. І WordPress в цьому випадку не виняток. За один день на сайті відбувається маса різних форм взаємодії користувачів із сервером. Наприклад, підписка на розсилку новин, повідомлення власнику сайту з форми зворотного зв’язку або заповнення форми замовлення. Все це виконується через POST запити. І в даній статті ми розглянемо обробку WordPress POST запитів

У цій статті ми розглянемо простий приклад обробки POST запиту з контактної форми. Щоб правильно витягнути дані будемо використовувати вбудований хук wordpress’а. Отримані дані відповідно будемо обробляти і перенаправляти користувача на заготовлену сторінку.

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

Передісторія

В основі WordPress лежить подієво-орієнтована архітектура. Це означає, що в ядрі WordPress зберігаються різні дії і фільтри, які певним чином змінюють роботу програми або контент. Прикладами дій запускаються одночасно зі стартом CMS є init, wp, template_redirect і wp_head. Безліч плагінів використовують ці дії і фільтри для модифікації роботи системи.

Ми хочемо добитися приблизно того ж. Нам лише потрібно знати правильні хуки для POST запитів та змінити код. Зробити це можна, розмістивши всі форми в окремому файлі admin-post.php в директорії wp-admin. Якщо ви вже працювали з WordPress internal AJAX API, то повинні зауважити, що структура admin-post.php не сильно відрізняється від файлу admin-ajax.php.

Анатомія admin-post.php

Якщо брати тільки самі основи, то у файлі admin-post.php всього 71 рядок коду. Спочатку задається константа WP_ADMIN і підключається сам WordPress за допомогою файлу wp-load.php. Після цього надсилаються заголовки і запускається admin_init. Нижче рядок, виконує те, що ми сказали вище:

$action = empty( $_REQUEST[‘action’] ) ? “: $_REQUEST[‘action’];

Незважаючи на ім’я admin-post.php даний файл обробляє як POST, так і GET запити. Тим не менш нас будуть цікавити тільки POST запити.

if ( empty( $action ) ) {
/**
* Fires on a non-authenticated admin post request where no action was supplied.
*
* @since 2.6.0
*/
do_action( ‘admin_post_nopriv’ );
} else {
/**
* Fires on a non-authenticated admin post request for the given action.
*
* The dynamic portion of the hook name, `$action`, refers to the given
* request action.
*
* @since 2.6.0
*/
do_action( “admin_post_nopriv_{$action}” );
}
} else {
if ( empty( $action ) ) {
/**
* Fires on an authenticated admin post request where no action was supplied.
*
* @since 2.6.0
*/
do_action( ‘admin_post’ );
} else {
/**
* Fires on an authenticated admin post request for the given action.
*
* The dynamic portion of the hook name, `$action`, refers to the given
* request action.
*
* @since 2.6.0
*/
do_action( “admin_post_{$action}” );
}
}

Як видно два різних хука спрацьовують залежно від статусу користувача, залогінився він чи ні. Для залогиненных користувачів використовується admin_post, а для незалогиненных admin_post_nopriv. Якщо ж потрібно обробити дані з вашого запиту, можна скористатися іншим дією admin_post_nopriv_{$action} або admin_post_{$action}, які теж базуються на статус польозвателя.

Скажімо, у нашого POST запиту action зі значенням foobar. Якщо користувач не зайшов під своїми даними, то виконуватися два екшену:

admin_post_nopriv

admin_post_nopriv_foobar

Якщо ви залогинитесь, виконуватися два інших екшену:

admin_post

admin_post_foobar

Всі вищеописані хуки можна застосувати і для GET запиту, якщо адреса приблизно такий: http://www.example.com/wp-admin/admin-post.php?action=foobar&data=test

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

Випробування концепції

Для прикладу візьмемо контактну форму. Найпростіший спосіб це створити форму у файлі page.php самому (не рекомендується), закодувати форму й обробляти дані POST запиту в цьому ж файлі. Приблизно ось так це працює:

Full Name
Email Address
Your Message

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

Для того, щоб позбутися від цієї проблеми і повністю задіяти подієво-орієнтовану природу WordPress нам знадобиться файл admin-post.php. З його допомогою можна конвертувати існуючу форму, щоб вона стала сумісна з файлом admin-post.php і зробити це досить просто. Спершу, замініть цей рядок:

На:

Для генерації правильного посилання, яка буде вести на файл admin-post.php ми використовуємо вбудовану функцію admin_url. Таким чином, ми забезпечимо надійний редирект на наш сайт. Також нам необхідно додати прихований action до формі, а для цього нам знадобиться ще один хук. Зазначимо name=»action», value=»contact_form». І додамо цю рядок між тегів форми.

Тепер наш шаблон сторінки виглядає так:

Full Name
Email Address
Your Message

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

Обробка запиту POST

На цьому етапі у нас є два варіанти, і обидва робітники. Можна запустити action admin_post_* через functions.php в нашій темі, або створити простий плагін обробки контактної форми. Для простоти будемо записувати все в functions.php. Згадаємо, що у нас є наш action contact_form, а значить, нам доступні чотири хука:

admin_post_nopriv

admin_post_nopriv_contact_form

admin_post

admin_post_contact_form

Відкрийте functions.php поточної теми і додайте ці рядки:

function prefix_send_email_to_admin() {
/**
* Звідси вже можна використовувати $_GET/$_POST
*
* Можна почати обробку
*/
// Перевіряємо POST
// Генеруємо текст листа
// Відправляємо по email
}
add_action( ‘admin_post_nopriv_contact_form’, ‘prefix_send_email_to_admin’ );
add_action( ‘admin_post_contact_form’, ‘prefix_send_email_to_admin’ );

Так як нам треба обробити форму незалежно від того, залогінився користувач чи ні, ми запускаємо функцію як для admin_post_nopriv_contact_form, так і для admin_post_contact_form. prefix_send_email_to_admin – основна функція, де відбувається обробка даних.

Висновок

Файл admin-post.php вкрай корисний, така перлина, прихована в глибині ядра WordPress. З його допомогою можна чітко розділити файли подання від коду, який займається обробкою запитів.