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;
}

Если нет времени и желания разбираться самостоятельно – обращайтесь

Наверх