Есть форма на странице, после отправки данных из формы, создал хук для проверки данных:
add_action ('wp_loaded', 'my_custom_redirect');
function my_custom_redirect() {
if(isset($_POST) && !empty($_POST['submit']) && !empty($_POST['review_direction'])){
$errors = [];
//проверка данных из формы
$fields = array(
'post_type' => 'custom_post',
'post_title' => $name, // заголовок поста
'post_content' => $textarea, // контент,
'post_status' => 'pending'
);
...
$post_id = wp_insert_post($fields)
if(!count($errors)){
wp_redirect($_SERVER['HTTP_REFERER']);
exit;
}
}
Здесь wp_redirect($_SERVER['HTTP_REFERER']);
нужен для отмены повторной отправки данных из формы при перезагрузке страницы.
Как теперь передать массив $errors
в форму если есть ошибки при заполнении формы?
И правильное ли решение, приведённое выше, т.е. вынесение проверки формы в хук wp_loaded ?
Это получается на каждой странице будет срабатывать эта проверка?
P.S.
Если добавить в функцию my_custom_redirect
этот код, остальные элементы массива $_POST из формы будут на странице, кроме $_POST['errors']
$_POST['errors'] = 'test';
Мне кажется удобнее как для пользователя, так и для Вас - отправлять форму с помощью ajax, проверять её на php и возвращать без перезагрузки страницы ответ. Ответ отправлять либо - "готово", или же массив содержащий ошибки, а там уже отображать ошибки как угодно. В сплывающем окне, над каждым полем формы, внизу формы или как Вам вздумается.
Добавим простую html форму с ID, который будим использовать в нашем JS файле при отправке формы.
html
<form action="" method="POST" id="checkout-form">
<input type="text" placeholder="Ваше имя" name="name" required>
<input type="email" placeholder="Ваш email" name="email">
<input type="hidden" name="captcha"> <!-- Наше скрытое поле "каптча", если оно заполнено, то скрипт прекратит своё выполнение -->
<button type="submit">Отправить</button>
</form>
functions.php
function payment_form() {
if( isset($_POST) ){
$errors = []; //Для удобства думаю при выводе(echo) скорее всего лучше перевести в json
//проверка данных из формы
//Проверка скрытого поля (невидимая каптча)
if ( isset($_POST['captcha']) && !empty($_POST['captcha']) ) { //<input> name с captcha сменить на другой, например "input-name" и тут соответственно тоже
array_push( $errors, 'captcha', 'false' );
echo $errors;
wp_die();
}
$fields = array(
'post_type' => 'custom_post',
'post_title' => sanitize_text_field( $name ), // убираем теги с заголовка записи
'post_content' => $textarea, // Нужно добавить функции с проверкой разрешенных html тегов и проверять контент
'post_status' => 'pending'
);
$post_id = wp_insert_post($fields);
if( $post_id ) { //Проверяем успешно ли добавлена наша запись
if( count($errors) ){
echo $errors;
wp_die();
} else {
echo 'succes';
}
} else {
array_push( $errors, 'post', 'false' );
echo $errors;
wp_die();
}
}
wp_die();
}
add_action( 'wp_ajax_payment_form', 'payment_form' );
add_action( 'wp_ajax_nopriv_payment_form', 'payment_form' );
Теперь подключим обработчик формы, который расположим в папке с нашей темой->подпапка "js"
function.php 2
function payment_form() {
//js
wp_enqueue_script( 'form', get_template_directory_uri() . '/js/form.js', array(), '1.0.0', true );
wp_localize_script( 'form', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php') ) );
}
add_action( 'wp_enqueue_scripts', 'payment_form' );
Сам js файл, который будит отвечать за отправку данных формы на сервер. form.js
var checkoutForm = document.getElementById("checkout-form");
checkoutForm && checkoutForm.addEventListener("submit", function(e){ //Проверяем, есть ли наша форма на странице
e.preventDefault();
this.querySelector("button").disabled = true; //отключим кнопку "Отправить" <button type="submit"></button>
var request = new XMLHttpRequest(); //Если нужна поддержка старых IE, тут нужно доработать
request.addEventListener('load', function(response) {
//Тут прийдет либо succes или же массив наших ошибок
console.log(response);
this.querySelector("button").disabled = false; //Включим кнопку отправить
});
request.addEventListener('error', function() { //Произошла ошибка при попытуке отправки
alert("An error has occurred! Refresh the page.");
});
request.open('POST', ajax_object.ajaxurl, true); //то что мы добавили в function.php 2
request.setRequestHeader('accept', 'application/json');
var formData = new FormData(form);
formData.append('action', 'payment_form'); //экшен нашей формы в function.php
request.send(formData);
});
Виртуальный выделенный сервер (VDS) становится отличным выбором
Кто знает есть ли готовое решение для подбора товара или какого другого элемента реализованных как в 1СВ частности интересует реализация...
На wiki очень сложно понять зачем нужны эти вещиПонял что для взаимодействия разных программных компонент(к примеру одна часть работает на Java, другая...
cURL парсит страницу, но она приходит в сжатом видеСреди headers, которые я отправляю, есть строчка 'Accept-Encoding: dzip, deflate', но, даже если ее убрать - результат...