@sk8er_boi

Неправильно определённая страница возврата после обработки формы в WordPress?

Создал физическую страницу "feedback.php", указал "Template Name: Feedback", создал страницу в админке wp, выбрал этот шаблон.

На физической странице создал форму, в файле functions.php сделал обработку формы.

Если валидация проходит или даже вообще всё закомментировать, возвращается "Страница не найдена" и wp выдаёт мне index.php

И только если в форме указать неверные данные, то возвращается страница с той же формой (wp ищет нужный мне feedback.php)

В форме менял action, хотя зачем, ведь обработка через индексный файл, в обработке делал wp_redirect(home_url('/feedback')) и чем только не занимался.

Да, письма приходят, естественно.

Форма в файле feedback.php
<?php

/*
 *
 * Template Name: Feedback
 *
 *
*/

get_header();

?>
<div id="page">
	<h1 style="font-weight: bold; font-size: 180%; "><?php the_title(); ?></h1>
	<?php
	
	if (current_user_can('manage_options')) {
		
		if (isset($errors) && $errors->get_error_codes()) {
	
	?>
	<div class="error-message">
		<?php foreach ($errors->get_error_messages() as $error) { ?>
		<div><?php echo $error; ?></div>
		<?php } ?>
	</div>
	<?php
	
		}
	
	?>
	<form action="<?php echo get_permalink(); ?>" class="fieldset" method="post">
		<div class="row">
			<div class="cell"><label for="name"><span class="fa fa-asterisk padding-right-before required">Ваше имя</span></label></div>
			<div class="cell"><input id="name" name="name" placeholder="Аркадий" type="text" value="" /></div>
		</div>
		<div class="row">
			<div class="cell"><label for="phone"><span class="fa fa-asterisk padding-right-before required">Номер телефона</span></label></div>
			<div class="cell"><input id="phone" name="phone" placeholder="8 (921) 243-56-78" type="text" value="" /></div>
		</div>
		<div class="row">
			<div class="cell"><label for="email"><span>Email-адрес</span></label></div>
			<div class="cell"><input id="email" name="email" placeholder="arkady.a@gmail.com" type="text" value="" /></div>
		</div>
		<div class="row">
			<div class="cell"><label for="theme"><span>Тема</span></label></div>
			<div class="cell"><input id="theme" name="theme" placeholder="Необязательное поле" type="text" value="" /></div>
		</div>
		<div class="row">
			<div class="cell"><label for="message"><span>Сообщение</span></label></div>
			<div class="cell"><textarea id="message" name="message" placeholder="Текст вашего сообщения"></textarea></div>
		</div>
		<div class="center row">
			<input name="_feedback" type="submit" value="Отправить" />
		</div>
	</form>
	<?php
	
	}
	
	?>
</div>
<?php

get_footer();

?>

Обработка в functions.php
if (isset($_POST['_feedback'])) {
	
	$validate = true;
	$errors = new WP_Error();
	
	foreach ($_POST as $key => $value) {
		if (!in_array($key, array('name', 'phone', 'email', 'theme', 'message', '_feedback', 'nonce'))) {
			$validate = false;
			$errors->add('ERROR_YOU_SENT_WRONG_DATA', 'Вы отправили неверные данные');
			break;
		}
		else {
			$_POST[$key] = trim($value);
		}
	}
	
	if (!isset($_POST['name']) || $_POST['name'] == null) {
		$validate = false;
		$errors->add('ERROR_NAME_FIELD_IS_REQUIRED', 'Поле &laquo;Ваше имя&raquo; обязательно для заполнения');
	}
	else {
		if (!preg_match('/^[ а-яА-ЯёЁ-]*$/u', $_POST['name'])) {
			$validate = false;
			$errors->add('ERROR_NAME_MUST_CONTAIN_ONLY_RUSSIAN_CHARACTERS', 'Поле &laquo;Ваше имя&raquo; может содержать только русские буквы');
		}
		elseif (mb_strlen($_POST['name']) < 2 || mb_strlen($_POST['name']) > 48) {
			$validate = false;
			$errors->add('ERROR_NAME_LENGTH_MUST_IN_2_32', 'Длина поля &laquo;Ваше имя&raquo; от 2 до 48 символов');
		}
		else {
			$_POST['name'] = ucfirst(strtolower($_POST['name']));
		}
	}
	
	if (!isset($_POST['phone'])) {
		$validate = false;
		$errors->add('ERROR_YOU_SENT_WRONG_DATA', 'Вы отправили неверные данные');
	}
	elseif (!isset($_POST['email'])) {
		$validate = false;
		$errors->add('ERROR_YOU_SENT_WRONG_DATA', 'Вы отправили неверные данные');
	}
	else {
		if ($_POST['phone'] == null && $_POST['email'] == null) {
			$validate = false;
			$errors->add('ERROR_ONE_OF_TWO_FIELDS_MUST_BE_FILLED', 'Одно из полей (&laquo;Номер телефона&raquo;, &laquo;Email-адрес&raquo;) должно быть заполнено');
		}
		else {
			if ($_POST['phone'] != null) {
				$_POST['phone'] = preg_replace('/[^0-9]/', '', $_POST['phone']);
				if (!preg_match('/^[0-9]{10,11}$/', $_POST['phone'])) {
					$errors->add('ERROR_YOU_HAVE_ENTERED_INVALID_PHONE', 'Вы ввели некорректный номер телефона');
					$validate = false;
				}
				else {
					$_POST['phone'] = preg_replace('/^[0-9]{0,1}([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})$/', "8-$1-\$2-\$3-\$4", $_POST['phone']);
				}
			}
			if ($_POST['email'] != null) {
				if (!preg_match('/^.*@.*$/', $_POST['email'])) {
					$validate = false;
					$errors->add('ERROR_YOU_HAVE_ENTERED_INVALID_EMAIL', 'Вы ввели некорректный email-адрес');
				}
				$_POST['email'] = htmlspecialchars($_POST['email']);
			}
		}
	}
	
	if (!isset($_POST['theme'])) {
		$validate = false;
		$errors->add('ERROR_YOU_SENT_WRONG_DATA', 'Вы отправили неверные данные');
	}
	else {
		$_POST['theme'] = htmlspecialchars($_POST['theme']);
		if ($_POST['theme'] == null) $_POST['theme'] = 'Без темы';
	}
	
	if (!isset($_POST['message'])) {
		$validate = false;
		$errors->add('ERROR_YOU_SENT_WRONG_DATA', 'Вы отправили неверные данные');
	}
	else {
		$_POST['message'] = htmlspecialchars($_POST['message']);
	}
	
	if ($validate) {
		$to = array(
			'<...>@gmail.com',
			// '<...>@gmail.com'
		);
		
		$subject = 'Запрос с сайта <...> [Обратная связь]';
		
		$headers = 'MIME-Version: 1.0' . "\r\n";
		$headers .= 'Content-type: text/html' . "\r\n";
		$headers .= 'From: ' . get_bloginfo('name') . ' <noreply@<...>>' . "\r\n";
		
		$message = 'Имя: ' . $_POST['name'] . '<br />';
		$message .= 'Телефон: ' . $_POST['phone'] . '<br />';
		$message .= 'Email: ' . $_POST['email'] . '<br />';
		$message .= 'Тема: ' . $_POST['theme'] . '<br />';
		$message .= 'Сообщение: ' . $_POST['message'];
		
		$sent = wp_mail($to, $subject, $message, $headers);
		if ($sent) {
			// wp_redirect(home_url() . '/feedback');
			$errors->add('SUCCESS_SENT', 'Ваше сообщение было отправлено');
		}
		else {
			$errors->add('ERROR_SENT', 'Возникла ошибка при отправке письма');
		}
	}
	else {
		
	}
	
}

  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
@sk8er_boi Автор вопроса
Решение нашлось здесь - www.blogalt.ru/cms/wordpress/404-forma.html

Как оказалось, я использовал в коде зарезервированную переменную $_POST['name'].

Заменив её на $_POST['first_name'], я решил проблему.

Было
<input id="name" name="name" placeholder="Аркадий" type="text" value="" />

Стало
<input id="name" name="first_name" placeholder="Аркадий" type="text" value="" />

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы