Від автора: доброго інтерактивного сайту необхідно взаємодіяти з даними, які вводить користувач. Дані вводяться в спеціальних формах, які є частиною виду. І 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 запиту в цьому ж файлі. Приблизно ось так це працює:
Email Address
Your Message
У такому вигляді концепція повністю працює, і немає ніяких натяків на те, що в майбутньому щось зламається. З точки зору продуктивності і зручності роботи з формою вона жахлива. Якщо потрібно продублювати таку форму, то доведеться повторювати обробку.
Для того, щоб позбутися від цієї проблеми і повністю задіяти подієво-орієнтовану природу WordPress нам знадобиться файл admin-post.php. З його допомогою можна конвертувати існуючу форму, щоб вона стала сумісна з файлом admin-post.php і зробити це досить просто. Спершу, замініть цей рядок:
На: