Простая форма с сохранением в базу данных
Я использую стороннюю службу, которая проверяет мою базу данных на наличие новых записей в определенной таблице. Однако я не могу найти простой плагин для форм, который отправляет данные в базу данных WordPress внутри таблицы и при этом не влияет на функциональность WordPress. Причина в том, что мой хостинг-провайдер разрешает мне использовать только одну базу данных.
Мне нужна форма в WordPress, которая:
- Собирает имя, телефон, email, отправленные конечным пользователем
- Сохраняет в базу данных
- Перенаправляет пользователя на страницу подтверждения
Ничего сложного, и хотя было бы здорово видеть результаты в административной панели WordPress, это не обязательно, так как я могу просто использовать phpMyAdmin.
Подводя итог:
Мне нужна простая HTML/PHP форма, где я могу просто вставить HTML код формы на страницу через административную панель WordPress в режиме HTML/код для страниц. Когда пользователь отправляет форму, она сохраняет данные в базу данных WordPress и затем перенаправляет пользователя на страницу "спасибо".

Насколько я понимаю, у вас уже есть таблица в базе данных.
Я не знаю, как вы её назвали, но лучшей практикой (для меня обязательной) является использование того же префикса таблицы, что и в WordPress, который задаётся в файле wp-config.php
.
Вы также не указали структуру таблицы, но предположу, что она выглядит примерно так:
ID (integer,primary,autoincrement) | name (varchar) | phone (varchar) | email (varchar)
Вы можете добавить шорткод для вывода формы. В ваш functions.php
добавьте:
add_action('init', function() {
add_shortcode('userform', 'print_user_form');
});
function print_user_form() {
echo '<form method="POST">';
wp_nonce_field('user_info', 'user_info_nonce', true, true);
?>
Все ваши поля формы (имя, email, телефон) должны быть здесь.
<?php
submit_button('Отправить данные');
echo '</form>';
}
Теперь просто создайте запись или страницу в админке WordPress и добавьте шорткод [userform]
: форма волшебным образом появится на странице.
Как вы видите, я не добавил атрибут action к форме, таким образом данные формы отправляются на ту же страницу.
Теперь вам нужно сохранить данные. Добавьте действие на ранний хук, проверьте $_POST
, убедитесь в правильности nonce и сохраните данные:
add_action('template_redirect', function() {
if ( ( is_single() || is_page() ) &&
isset($_POST[user_info_nonce]) &&
wp_verify_nonce($_POST[user_info_nonce], 'user_info')
) {
// Валидацию данных следует выполнить перед сохранением в БД.
// Я не буду писать функцию валидации, это выходит за рамки данного ответа
$pass_validation = validate_user_data($_POST);
if ( $pass_validation ) {
$data = array(
'name' => $_POST['name'],
'email' => $_POST['email'],
'phone' => $_POST['phone'],
);
global $wpdb;
// Если вы последовали моему совету и назвали таблицу с префиксом WordPress
$table_name = $wpdb->prefix . 'my_custom_table';
// Следующая строка вставит данные
$wpdb->insert($table_name, $data, '%s');
// Если вам нужно получить ID только что вставленной строки, используйте
$rowid = $wpdb->insert_id;
// После вставки данных следует перенаправить пользователя
// Я рекомендую создать отдельную страницу с заголовком "Спасибо"
// Если вы так сделаете:
$redirect_page = get_page_by_title('Спасибо') ? : get_queried_object();
// Предыдущая строка, если страница с заголовком 'Спасибо' не найдена,
// установит текущую страницу для перенаправления. Следующая строка получит URL страницы:
$redirect_url = get_permalink( $redirect_page );
// Теперь выполняем перенаправление
wp_safe_redirect( $redirect_url );
// И завершаем выполнение PHP
exit();
}
}
});
Код достаточно грубый, но может служить отправной точкой. Встроенные комментарии помогут вам понять последовательность действий.
Обязательно ознакомьтесь с документацией:

Спасибо за очень подробный ответ. Это много информации для осмысления, я сообщу вам о своих результатах и ещё раз благодарю.

Быстрые вопросы: 1. Если мне нужно больше одной формы, можно ли добавить имя к шорткоду, например [userform:FormA] или [userform:Contact], что добавит FormA к ID-классу HTML-поля формы, а также поместит FormA в скрытое поле формы? 2. Для второго блока кода — его тоже нужно поместить в файл functions.php? 3. Какая часть второго примера кода заставляет WordPress понимать, что эту функциональность нужно выполнять только для форм, созданных этим методом? Я не вижу проверки, что отправка формы произошла именно из формы, созданной через шорткод.

(1) вам нужны атрибуты шорткода — с их помощью вы можете настраивать форму как угодно, см. документацию add_shortcode
, ссылки на которую есть в ответе. (2) Да. Код, который начинается с add_filter
или add_action
, нужно либо поместить в плагин, либо в functions.php
: это зависит от того, хотите ли вы потерять эту функциональность при смене темы. (3) для этого и существует wp_verify_nonce
. Он проверяет переменную $_POST
(созданную wp_nonce_field
), которая содержит зашифрованное значение, созданное на основе строки — в данном случае 'user_info'. Опять же, см. ссылки на документацию в конце ответа. @Damainman

Быстрый вопрос: у вас есть закрывающий тег php в начале и открывающий тег php ближе к концу функции шорткода. Можете объяснить, почему так сделано?

@Damainman "Все поля формы (имя, email, телефон) должны быть здесь." — это предполагается как placeholder для html части формы, поэтому я закрываю теги php перед этим и открываю снова после, чтобы избежать множества некрасивых последовательностей echo
. Просто пишите html там, как вы обычно это делаете.
