WordPress – получаем данные из формы
17 февраля 2022Обычная html форма
<form method='post' action='yookassa.php'>
<label for="sum">Сумма, руб</label>
<input type="text" id="sum" value="100">
<input type="submit" id="submit" value="Оплатить">
</form>
На WordPress странице “в лоб” работать не будет. Почему так – отдельная тема.
Нужно
<form method='post' action='<?php echo esc_url( admin_url('admin-post.php') ); ?>'>
<input type="hidden" name="action" value="yookassa">
<label for="sum">Сумма, руб</label>
<input type="text" id="sum" name="sum" value="100">
<input type="submit" id="submit" value="Оплатить">
</form>
Теперь обрабатывать форму будет
mysite.com/wp-admin/admin-post.php – POST метод отправки формы
mysite.com/wp-admin/admin-post.php?action=yookassa&sum=100 – если бы был GET метод
admin-post.php – может работать с GET и POST запросами и запустит обработчик, для которого в форме должно быть специальное поле с именем action
<input type=”hidden” name=”action” value=”yookassa”>
CCS добавляем самостоятельно – подгоняем под стиль страницы
В functions.php помещаем код
Понадобятся 2 хука
admin_post_{action} – для авторизованных пользователей
admin_post_nopriv_{action} – для НЕ авторизованных пользователей
action – значение поля из формы с именем action, в нашем случае “yookassa”
add_action( 'admin_post_yookassa', 'handler_yookassa' ); //
add_action( 'admin_post_nopriv_yookassa', 'handler_yookassa' ); //
В данном случае все равно авторизован пользователь или нет, поэтому обработчик для любого хука один и тот же – handler_yookassa
function handler_yookassa() {
// Получаем данные из формы в виде массива $_POST
$agrs = $_POST;
if($agrs) {
// Что-то делаем с данными
// Например, запишем в лог файл
ob_start();
foreach ($agrs as $key => $value) {
echo "$key: $value\n";
}
$log = date('Y-m-d H:i:s') . PHP_EOL . ob_get_clean() . PHP_EOL;
file_put_contents(__DIR__ . '/log.txt', $log, FILE_APPEND);
}
}
Получится как-то так (wp-content\themes\yourtheme\log.txt)
2023-05-17 09:54:18
action: yookassa
sum: 100
Что-то сделать с данными – отправить на почту или в телеграмм или записать в БД
function handler_yookassa() {
// Получаем данные из формы в виде массива $_POST
// Что-то делаем с данными
$url = home_url().'/ok';
wp_redirect( $url );
exit;
}
Еще неплохо бы
Валидацию можно разбить на 2 части
Сделать проверку на стороне клиента с помощью js скрипта
и в обработчике после получения данных
Проверяем поле формы sum – оно должно содержать цифры и быть больше нуля
Если в форме будут еще поля, проверяем тоже
валидность e-mail
только буквы в ФИО
и т.д.
Чтобы форму можно было легко вставить в любое место страницы – делаем шоткод
[vh_shotcode_simple_payment_data_form]
в functions.php вешаем на хук after_setup_theme
add_action( 'after_setup_theme', 'vahro_theme_setup' );
function vahro_theme_setup() {
add_shortcode( 'vh_shotcode_simple_payment_data_form',
'vh_simple_payment_data_form' );
}
функция шоткода
function vh_simple_payment_data_form() {
$action = esc_url( admin_url('admin-post.php') );
return <<<HTML
<form class="vh-pf-form" method="post" action="$action">
<input type="hidden" name="action" value="yookassa">
<label class="vh-pf-form-label" for="vh-pf-sum">Сумма, руб</label>
<input class="vh-pf-form-sum" type="text" id="vh-pf-sum" name="vh-pf-sum" value="100">
<input class="vh-pf-form-submit" type="submit" id="vh-pf-submit" value="Оплатить">
</form>
HTML;
}
Если нет времени и желания разбираться самостоятельно – обращайтесь