Вопрос или проблема
Я создал простую форму, которую можно отправить на admin-post.php
, а также отправить через AJAX-запрос на admin-ajax.php
. Обе отправки работают правильно, используют nonce
для дополнительной безопасности, и я могу обрабатывать данные по мере необходимости.
Мой вопрос и проблема в том, как, используя обычную отправку формы POST на admin-post.php
, отправить обратно сообщение форме с текстом об успешной отправке или с ошибкой, которая может быть строкой или массивом невалидных полей формы? При вызове AJAX я могу просто эхо json закодированный ответ.
Я знаю, что сессия не устанавливается, если я вручную не вызову session_start()
, и использование глобальных переменных не является идеальным вариантом. Существует ли другой вид хранения или система, которую я могу использовать для передачи этих сообщений?
Я ранее использовал transients – будут ли они подходящими? Я понимаю, что данные transient могут быть недоступны в любой момент, так что, возможно, нет?
Могу ли я использовать класс WP_Error?
Да, вы можете использовать JSON-ответ, содержащий свойство error
.
<?php
echo json_encode( [
'error' => [
'code' => 'my_error_code',
'message' => 'My error message.',
'data' => [любые дополнительные данные, которые вам нужны],
],
] );
Ваш AJAX-обработчик должен проверять наличие error
и адаптироваться соответствующим образом.
Для обычного POST вам нужно будет создать HTML-разметку, которая создаст WP Notice или разметку, которую вы будете стилизовать как уведомление. См.: Полное руководство по уведомлениям
Ответ или решение
Как реализовать валидацию пользовательских форм в WordPress
Исходные данные
Вы создали форму, которая может отправлять данные через POST
на admin-post.php
, а также асинхронно через AJAX на admin-ajax.php
. Оба метода работают корректно: используется nonce
для дополнительной безопасности, а данные обрабатываются как необходимо. Возник вопрос: как при обычной отправке формы на admin-post.php
вернуть пользователю сообщение об успешной отправке или об ошибке, которая может включать как строку, так и массив некорректных полей формы?
Проблема
В случае с AJAX все просто: можно просто вернуть JSON с информацией об ошибке. Однако, при обычной POST-отправке надо каким-то образом вернуть сообщение на страницу формы.
Возможные решения
-
Использование сессий: Да, вы правильно заметили, что сессии по умолчанию не используются в WordPress. Вы можете их включить, вызвав
session_start()
, но это не принято и может вызвать конфликты с плагинами. -
Глобальные переменные: Исполнение этого метода также ограничено возможностью конфликтов и не рекомендуется.
-
API переадресации и оповещений WordPress: В WordPress предусмотрен подход через использование системы уведомлений. Вы можете использовать перенаправление назад на исходную страницу формы после обработки данных, добавляя параметры в URL, отражающие статус обработки.
- Оповещения WordPress: Плохо бы уточнить ссылки, а также привести пример того, как использовать
add_settings_error()
, чтобы создать уведомление в админке WordPress. Этот метод обычно применяется через фильтры, такие какadmin_notices
, чтобы отобразить сообщения для пользователя.
- Оповещения WordPress: Плохо бы уточнить ссылки, а также привести пример того, как использовать
add_action('admin_notices', 'my_custom_notice');
function my_custom_notice() {
if( isset($_GET['status']) ) {
echo '<div class="notice notice-success is-dismissible">
<p>Form successfully submitted!</p>
</div>';
} elseif (isset($_GET['error'])) {
echo '<div class="notice notice-error">
<p>There was an issue with your form.</p>
</div>';
}
}
-
Классы WP_Error и Transients API:
-
WP_Error: Этот класс позволяет оперировать ошибками, но его использование в случае с отображением сообщений для пользователя при POST-запросах, вероятно, не даст того результата, который вы ищете, поскольку WP_Error предназначен скорее для обработки и передачи ошибок в коде.
-
Transients API: Транзиенты в WordPress — это временные кешированные данные, которые можно использовать для хранения сообщений. Однако они могут быть очищены в любой момент, поэтому не являются надежным механизмом для этого сценария.
-
Вывод
Наиболее подходящий метод — это использование системы оповещений WordPress с добавлением параметров статуса в URL после обработки формы. Этот подход не требует дополнительных библиотек или изменений в ядре WordPress и обеспечивает надежный способ отображать пользователю сообщения о статусе отправки формы.
Этот метод не только соответствует стандартам безопасности и лучшим практикам WordPress, но и позволяет поддерживать чистый и управляемый код, избегая использования сессий или глобальных переменных.