Настраиваемая проверка формы

Вопрос или проблема

Я создал простую форму, которую можно отправить на 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-отправке надо каким-то образом вернуть сообщение на страницу формы.

Возможные решения

  1. Использование сессий: Да, вы правильно заметили, что сессии по умолчанию не используются в WordPress. Вы можете их включить, вызвав session_start(), но это не принято и может вызвать конфликты с плагинами.

  2. Глобальные переменные: Исполнение этого метода также ограничено возможностью конфликтов и не рекомендуется.

  3. API переадресации и оповещений WordPress: В WordPress предусмотрен подход через использование системы уведомлений. Вы можете использовать перенаправление назад на исходную страницу формы после обработки данных, добавляя параметры в URL, отражающие статус обработки.

    • Оповещения WordPress: Плохо бы уточнить ссылки, а также привести пример того, как использовать add_settings_error(), чтобы создать уведомление в админке WordPress. Этот метод обычно применяется через фильтры, такие как admin_notices, чтобы отобразить сообщения для пользователя.
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>';
    }
}
  1. Классы WP_Error и Transients API:

    • WP_Error: Этот класс позволяет оперировать ошибками, но его использование в случае с отображением сообщений для пользователя при POST-запросах, вероятно, не даст того результата, который вы ищете, поскольку WP_Error предназначен скорее для обработки и передачи ошибок в коде.

    • Transients API: Транзиенты в WordPress — это временные кешированные данные, которые можно использовать для хранения сообщений. Однако они могут быть очищены в любой момент, поэтому не являются надежным механизмом для этого сценария.

Вывод

Наиболее подходящий метод — это использование системы оповещений WordPress с добавлением параметров статуса в URL после обработки формы. Этот подход не требует дополнительных библиотек или изменений в ядре WordPress и обеспечивает надежный способ отображать пользователю сообщения о статусе отправки формы.

Этот метод не только соответствует стандартам безопасности и лучшим практикам WordPress, но и позволяет поддерживать чистый и управляемый код, избегая использования сессий или глобальных переменных.

Оцените материал
Добавить комментарий

Капча загружается...