Как использовать nonce при отправке формы с фронтенда?
Благодаря различным постам здесь мне удалось создать форму отправки на фронтенде. После примерно 24 часов настройки я наконец-то заставил все работать, включая перенаправление на страницу "успешно" после отправки, но я не знаю, что делать с nonce.
Вот страница с формой: http://pastebin.com/YWyXL3jY
А вот страница успешной отправки: http://pastebin.com/3Usu0Pt6
Это оба пользовательских шаблона страниц (я знаю, что форматирование сейчас немного разбросано, так как разные части взяты из разных источников, и я не думаю, что буду использовать функцию загрузки файлов, поскольку предпочитаю использовать плагин для лучшей безопасности).
Нужно ли обрабатывать nonce до того, как пользователь будет перенаправлен на страницу успеха? У меня совсем нет опыта работы с nonce, и я программирую на PHP методом "копировать-вставить", так что, пожалуйста, будьте снисходительны!
Огромное спасибо за любой совет, который вы можете дать :)

Используйте следующий код непосредственно перед закрывающим тегом на фронтенде вашего сайта.
wp_nonce_field('name_of_your_action', 'name_of_your_nonce_field');
Данный код сгенерирует два скрытых поля внутри вашей формы. Теперь вы можете проверить nonce на бэкенде при обработке формы. Используйте следующий код для проверки созданного nonce.
if(wp_verify_nonce($_REQUEST['name_of_your_nonce_field'], 'name_of_your_action')){
// Nonce совпадает и действителен. Теперь можно выполнять нужные действия.
} else {
// Неверный nonce. Здесь можно вывести сообщение об ошибке.
}
Важное замечание: обратите внимание, что "name_of_your_action" является первым аргументом функции 'wp_nonce_field()' и вторым аргументом функции 'wp_verify_nonce()'. :) Поэтому не используйте его в качестве первого аргумента в обеих функциях. Многие делают эту ошибку, поэтому я хотел об этом упомянуть.

Для добавления nonce к форме вы можете использовать следующую функцию:
wp_nonce_field($action, $name, $referer, $echo)
- $action = (необязательный) это строка, представляющая название действия
- $name = (необязательный) это строка, представляющая имя nonce. Если оставить это поле пустым, WordPress по умолчанию использует "_wpnonce"
Пример:
Фронтенд:
<form action="" method="post">
<?php wp_nonce_field('my_delete_action'); ?>
<input type="hidden" name="id" value="<?php echo $id; ?>" />
<input type="text" name="rec_name" value="<?php echo $name; ?>" />
<input type="submit" value="Delete" />
</form>
Бэкенд:
$retrieved_nonce = $_REQUEST['_wpnonce'];
if (!wp_verify_nonce($retrieved_nonce, 'delete_my_action')) die('Failed security check');
Источник: https://www.tipsandtricks-hq.com/introduction-to-wordpress-nonces-5357

Используйте это для создания и проверки nonce.
wp_nonce_field('test_action', 'submit_post');
Это сгенерирует поле nonce, которое вы можете проверить с помощью следующего кода.
if(wp_verify_nonce($_REQUEST['test_action'], 'submit_post')){
/// выполните ваши действия
}else{
/// выбросьте ошибку
}

Начиная с этой страницы: http://codex.wordpress.org/WordPress_Nonces
Затем, изучив использование wp_verify_nonce
и пример использования wp_nonce_field
, вы должны проверить результат верификации и решить, что делать (обычно это завершение работы, но в вашем случае, вероятно, вывод сообщения об ошибке через echo
). Вы можете использовать проверку как условие "проверки отправки формы" в строке 8:
if ( empty($_POST) || wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') === false ) {
/* ошибка */
} else {
/* успех, обработка, редирект */
}
Если ответ положительный, вы выполняете следующее действие — например, отображаете сообщение об успехе или, в вашем случае, перенаправляете страницу. Убедитесь, что редирект выполняется до вывода любого контента.
Также стоит учесть: http://kovshenin.com/2012/nonces-on-the-front-end-is-a-bad-idea/ — хотя в данном случае, поскольку вы создаете контент, автор упоминает, что использование nonce здесь "правильно".
