Как проверить успешность выполнения $wpdb->insert() в WordPress?
Я пытаюсь написать небольшой скрипт в своем footer.php
(который позже преобразую в плагин), который отправляет два поля формы в пользовательскую таблицу (wp_newsletter
). Форма уже отправляется и записывает данные в таблицу, но я не знаю, как отправить пользователю сообщение об успехе или ошибке. Мой текущий код выглядит так:
<form method="post">
<input type="text" name="user_name">Имя
<input type="text" name="user_email">Email
<input type="submit">
<?php echo $message; ?>
</form>
<?php
global $wpdb;
$table = $wpdb->prefix . "newsletter";
$name = sanitize_text_field( $_POST["user_name"] );
$email = sanitize_email( $_POST["user_email"] );
$message = "";
if( isset($_POST["submit"]) ) {
if ( is_email($email) && isset($name)) {
if ( $wpdb->insert( $table, array("name" => $name, "email" => $email)) != false ) {
$message = "Ваша подписка успешно отправлена.";
}
}
else {
if ( !is_email($email) ) {
$message = "Некорректный email адрес.";
} elseif ( !isset($name) ) {
$message = "Поле имени обязательно для заполнения.";
} else {
$message = "Оба поля - имя и email - обязательны для заполнения.";
}
}
} else {
$message = "Пожалуйста, попробуйте позже.";
}
?>
<?php wp_footer(); ?>
</body>
</html>
Я (думаю) правильно проверяю результат, согласно документации $wpdb, где сказано:
Эта функция возвращает false, если строка не может быть вставлена. В противном случае она возвращает количество затронутых строк (которое всегда будет равно 1).

Возвращает либо количество вставленных строк, либо false в случае ошибки.
Можно получить ID вставленной записи или false, если вставка не удалась:
Ссылка для справки: https://developer.wordpress.org/reference/classes/wpdb/insert/#return
Таким образом, проверка может выглядеть следующим образом:
$result_check = $wpdb->insert( $table, array("name" => $name, "email" => $email));
if($result_check){
//успешно вставлено
}else{
//что-то пошло не так
}

Когда я осознал, что PHP — это акроним для "PHP: Hypertext Preprocessor" (с акцентом на "препроцессор"), я наконец понял, что нельзя просто смешивать PHP и HTML и ожидать какой-либо интерактивности с пользователем. Когда веб-страница загружается, PHP генерирует HTML, который затем отображается браузером. Если пользователь совершает действие, на которое должен отреагировать PHP, это обязательно должно вызывать новую PHP/HTML страницу, чтобы обеспечить какой-то ответ. (Альтернативой может быть использование AJAX для обмена данными без загрузки новой страницы. WordPress хорошо работает с AJAX, и руководства можно легко найти через поиск в Google.)
Для простой формы, подобной вашей, я бы использовал JavaScript для проверки ошибок. Если форма не заполнена, предотвращайте её отправку с помощью JS. Если форма заполнена корректно, её действие (action) может указывать на .php файл, который выполняет вставку в базу данных и отображает сообщение об успехе/ошибке в HTML.

Спасибо за совет, scott. Как я могу создать такой .php
файл, который будет отображать пользователю сообщение об успехе/ошибке?

Извините за поздний ответ. В веб-среде я бы указал в атрибуте action формы файл .php. Данные отправляются через GET в целевой файл. Затем данные обрабатываются и вставляются в БД. После этого .php файл выводит HTML в новый веб-документ, который указывает на успех или ошибку. Обратите внимание, что это не дает пользователю много возможностей исправить ошибки для достижения лучшего результата после загрузки новой страницы.

Однако в WordPress я бы рассмотрел возможность использования AJAX. Есть много хороших руководств, и я бы также посмотрел в Кодексе, но вот два, которые сработали у меня: https://www.smashingmagazine.com/2011/10/how-to-use-ajax-in-wordpress/ и https://premium.wpmudev.org/blog/using-ajax-with-wordpress/
AJAX позволяет получать доступ к БД без загрузки новой веб-страницы. Так что у вас может быть элемент без HTML-содержимого до тех пор, пока AJAX не вернет результат об успехе/ошибке:
document.getElementById("results-div").innerHTML = content.result;

Логика обработки формы находится в том же файле, что и сама форма: footer.php
. Я просто пытаюсь заставить это работать таким образом, а потом смогу разделить это лучше, когда закончу тесты. Несмотря на это, я не хочу отправлять данные моей формы через GET.

Моя ошибка. Вы можете использовать POST. Похоже, вы хотите сделать AJAX внутри footer.php, чтобы не происходила перезагрузка страницы. Вам придется использовать javascript для отправки/получения данных AJAX, но вы можете создать новый .php файл для обработки AJAX-запроса. (Я размещаю свои .php файлы внутри плагина, чтобы все зависимости обрабатывались системой WP.)
