Вопрос или проблема
В моем случае мне нужно отправить форму на тот же файл, который является классом, без использования какого-либо JavaScript или хука. Действие формы action="<?php echo $_SERVER['PHP_SELF']; ?>"
. Форма отправляется, но перенаправляет на главную страницу сайта. Если ссылка на страницу http://sitename.com/my-link/
и форма находится по этой ссылке, после отправки формы URL должен быть http://sitename.com/my-link/?taskname=abc
, но он перенаправляет на главную страницу сайта, как http://sitename.com/?taskname=abc
. Что я здесь упустил?
class tasks{
function search_form(){
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="GET" >
<input type="text" name="taskname" >
</form>
}
function search_form_submit(){
echo $_GET['taskname'];
}
}
$tasks_obj = new tasks();
if($_SERVER['REQUEST_METHOD'] == 'GET') {
$tasks_obj->search_form_submit();
}
Если ваша форма встроена в шорткод или какую-либо другую форму на фронтенде, я бы отправлял на постоянную ссылку страницы. Это более надежно, чем использование action=”” исходя из моего опыта. Затем выводите что-то на этой странице, чтобы подтвердить отправку или показать ошибку.
$global $post;
printf('<form method="post" action="%s">',get_permalink($post->ID));
или для формы на стороне администратора:
printf('<form method="post" action="%s">',admin_url('admin.php?page=custom_form'));
В admin_url укажите ту часть URL страницы, которая идет после wp-admin/
Ответ или решение
Чтобы сохранить URL при отправке формы на одной и той же странице без использования JavaScript или хуков, вы можете использовать метод GET
и корректно обрабатывать адресацию в вашем PHP-коде. Давайте рассмотрим возможные решения вашей проблемы.
Вы указали, что форма отправляется с помощью action="<?php echo $_SERVER['PHP_SELF']; ?>"
. Это означает, что форма будет отправлена на тот же URL, на котором она находится. Однако, чтобы URL оставался актуальным после отправки формы, нужно убедиться, что вы правильно работаете с параметрами запроса (query parameters).
Рекомендованное решение
Для начала, убедитесь, что ваша форма выглядит следующим образом:
class tasks {
function search_form() {
echo '<form action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '" method="GET">';
echo '<input type="text" name="taskname" />';
echo '<input type="submit" value="Отправить" />';
echo '</form>';
}
function search_form_submit() {
if (isset($_GET['taskname'])) {
echo htmlspecialchars($_GET['taskname']);
}
}
}
$tasks_obj = new tasks();
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
$tasks_obj->search_form_submit();
}
$tasks_obj->search_form(); // Вызов формы для отображения
Объяснение кода
-
Форма: Мы используем
htmlspecialchars($_SERVER['PHP_SELF'])
для предотвращения XSS-атак и сохраняем URL после отправки. Важно также добавить кнопку отправки (<input type="submit" ...>
), чтобы пользователь мог отправить форму. -
Обработка данных: В методе
search_form_submit
, мы проверяем, установлен ли параметрtaskname
в$_GET
, и если установлен, выводим его значение. -
Проверка метода GET: Другой блок кода, который обрабатывает запросы, осуществляет вызов метода
search_form_submit()
, если метод запроса GET.
После выполнения этой логики, если ваше URL было, например, http://sitename.com/my-link/
, после отправки формы с параметром taskname=abc
, URL останется как http://sitename.com/my-link/?taskname=abc
, и вы сможете видеть значение объекта, переданное через форму.
Дополнительные рекомендации
Если ваше приложение использует маршрутизацию, то убедитесь, что сервер (например, Apache или Nginx) правильно настроен и что не происходит перезаписи URL, что может привести к редиректу на главную страницу.
Также, если вы хотите, чтобы после отправки формы отображалась какая-то информация на странице, вы можете выполнять логику отображения данных там же, где вызывается форма, избавляясь от лишних редиректов и оставаясь на одной странице.
Таким образом, вы сможете достичь желаемого поведения при отправке формы без лишних переспрямлений.