Кастомная форма, шорткод и обработчик отправки - решение проблемы 404
У меня есть фронтенд-форма с несколькими полями ввода. Требования вынуждают меня использовать кастомный шорткод для создания формы. Я уже протестировал страницу с этим шорткодом.
Вот мой код:
<form name="myform" method="post" action="<?php echo str_replace( '%7E', '~', $_SERVER['REQUEST_URI']); ?>" enctype="multipart/form-data">
Исходя из этого, форма должна открывать ту же страницу (и это работало). Однако при отправке формы я получаю 404 ошибку на этом же URL. Есть ли решение?
ОБНОВЛЕНИЕ #1
Пробую другой подход, используя add_action('init'):
add_action('init', 'mbro1_intercept_form_input');
function mbro1_intercept_form_input()
{
if( !(isset($_POST['action_code']) && $_POST['action_code'] == 'mbro_intercept_form_input') )
return "";
if( isset( $_POST['submit'] ) )
{
//выполняю мой код здесь
wp_redirect( get_permalink(35) ); //страница с [шорткодом]
}
}
Этот код успешно выполняет нужные действия при отправке. Но! После редиректа все равно получаю 404. Не понимаю, в чем проблема.
Есть ли в вашей форме поле ввода с именем "name"? Например:
<input type="text" name="name">
Если да, это может вызвать проблемы. Измените значение атрибута name.
Смотрите также: Поле 'name' в форме вызывает ошибку и переход на страницу 404.

Я предполагаю, что строка ближе к концу
wp_redirect( get_permalink(35) );//страница с формой
является тем, что не работает. Я бы изменил её на это
$redirect_link = get_permalink(35) ; //страница с формой
wp_redirect( $redirect_link ); // инициировать перенаправление
exit;
это должно заставить функцию работать правильно

Какой именно ссылке выдает 404? То есть, какой URL страницы, на которую он пытается перенаправить и из-за этого получает 404?

это исходит из example.com/?page_id=35 и при отправке переходит на example.com/?page_id=35. После обработки он должен перенаправлять на example.com/?page_id=35, чтобы при обновлении страницы пользователем это не влияло на сайт.

Я использую die()
в качестве решения. Хотя мне это не особо нравится.
$redirect_link = get_permalink(35); //страница с формой
$script_redirect = "<div>Ваша форма отправлена. Пожалуйста, подождите. Если браузер не перенаправил вас автоматически, нажмите <a href='$redirect_link'>здесь</a>.</div>
<script type='text/javascript' language='javascript'>
window.location = '$redirect_link';
</script> ";
die( $script_redirect );

Сработает ли, если добавить die()
после вызова wp_redirect()
? Простой вызов редиректа не останавливает выполнение скрипта. Этот паттерн можно увидеть и в ядре WordPress: wp_redirect( $somewhere ); exit;
.
