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

16

Від автора: доброго інтерактивного сайту необхідно взаємодіяти з даними, які вводить користувач. Дані вводяться в спеціальних формах, які є частиною виду. І 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