wp_redirect не работает после отправки формы

22 дек. 2012 г., 19:28:32
Просмотры: 19.2K
Голосов: 8

Я использую этот редирект после создания поста. Он не работает, просто обновляет страницу с формой. Я знаю, что $pid получает ID поста, так в чем проблема? Это самый конец моего php-кода для обработки отправки формы.

$pid = wp_insert_post($new_post);

update_post_meta($pid,'domain',$domain);
update_post_meta($pid,'keywords',$keywords);

wp_redirect( get_permalink($pid) );
exit();

Вот полный код на pastebin

При использовании плагина Better HTTP Redirects вывод такой, и слово here ведет на корректно опубликованный пост.

302 Found
The document has moved here.
5
Комментарии

Сложно что-то предположить по этой информации, вы пробовали отладить это для получения более подробных сведений? Плагин Better HTTP Redirects — хороший инструмент для анализа проблем с редиректами.

Rarst Rarst
22 дек. 2012 г. 19:32:09

Пожалуйста, опубликуйте этот код в контексте.

s_ha_dum s_ha_dum
22 дек. 2012 г. 19:33:47

@s_ha_dum Я обновил свой вопрос, включив в него pastebin

Anagio Anagio
22 дек. 2012 г. 19:38:08

@Rarst Я обновил вопрос, добавив pastebin со всем кодом

Anagio Anagio
22 дек. 2012 г. 19:38:24

@Rarst Я установил плагин, пожалуйста, посмотрите мой обновленный пост - он показывает 302 и ссылается на новый пост, но не обновляется там

Anagio Anagio
22 дек. 2012 г. 19:44:55
Все ответы на вопрос 2
5
15

Вы можете использовать wp_redirect только до того, как контент будет отправлен в браузер. Если включить отладку PHP, вы увидите ошибку "headers already sent" из-за вызова get_header() в первой строке.

Вместо обработки формы в шаблоне, вы можете использовать более ранний хук, такой как wp_loaded, и сэкономить несколько запросов к базе данных, если собираетесь перенаправить пользователя.

РЕДАКТИРОВАНО, пример:

add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
    if( isset( $_POST['my_form_widget'] ) ):
        // обрабатываем форму, затем
        wp_redirect( get_permalink( $pid ) );
        exit();
    endif;
}

Используя хук, вы можете держать код отдельно от шаблонов. Объедините это с шорткодом для вывода формы и оберните всё в класс, чтобы сохранять состояние между обработкой и выводом — тогда можно обойтись без изменений фронтенд-шаблонов.

22 дек. 2012 г. 19:53:07
Комментарии

@Miloe да, я только что увидел сообщение "headers already sent" при включенном режиме отладки и плагине better http redirect. Я не знаком с использованием хуков, не могли бы вы указать на какой-то учебник или показать пример кода, пожалуйста

Anagio Anagio
22 дек. 2012 г. 19:55:46

@Anagio - добавил пример

Milo Milo
22 дек. 2012 г. 21:53:52

Спасибо, значит вы предлагаете поместить форму в шорткод, а затем использовать do_shortcode() в шаблоне для отображения формы. Хук должен быть добавлен в мой functions.php. Каким должно быть действие формы, чтобы вызвать функцию/хук?

Anagio Anagio
23 дек. 2012 г. 09:36:29

вам не пришлось бы использовать do_shortcode, я хотел сказать, что вы можете добавить форму через шорткод в контент записи/страницы, тогда вся ваша обработка и код рендеринга будут отделены от шаблона. Таким образом, форма сможет работать на любой странице, куда вы поместите шорткод формы в контенте. Действие может просто указывать на текущую страницу с помощью # или быть пустым, поскольку вы перехватываете все запросы, чтобы проверить, была ли отправлена ваша форма, это будет работать с любой страницы.

Milo Milo
23 дек. 2012 г. 19:54:48

@Milo вы попали прямо в точку. Проблема была в "headers already sent". Спасибо

henrywright henrywright
24 сент. 2013 г. 18:38:34
4

Перемещение get_header(); в конец кода должно решить проблему. Ваш код выполнится до отправки каких-либо заголовков, и редирект будет работать.

// ...
wp_redirect( get_permalink($pid) );
exit();
// вставка таксономий
} 
get_header(); ?>

Я предполагаю, что на странице есть ещё код ниже того, что вы показали? Если нет, то я не вижу необходимости в get_header() вообще.

Единственное преимущество использования хука, как предлагает Мило, заключается в том, что вы можете избежать некоторой нагрузки, если выберете достаточно ранний хук. Это может сократить время обработки на доли секунды.

22 дек. 2012 г. 20:20:14
Комментарии

Да, здесь есть немного HTML и дополнительные WordPress-функции, такие как get_sidebars() и get_footer() и т.д. Я совершенно не знаком с использованием хуков, но очень хотел бы увидеть пример. Я уже гуглю и вижу, как люди обсуждают add_action('wp_loaded', 'your_function'), но не совсем понимаю, как это использовать. Буду благодарен за любые примеры, спасибо.

Anagio Anagio
22 дек. 2012 г. 20:22:35

Я подожду немного и посмотрю, опубликует ли @Milo пример с использованием хука, так как это его ответ. Если нет, я отредактирую свой ответ.

s_ha_dum s_ha_dum
22 дек. 2012 г. 20:25:03

Спасибо, перемещение get_header() ниже кода обработки формы и редирект сработали. Но я бы всё равно хотел увидеть, как использовать хук.

Anagio Anagio
22 дек. 2012 г. 20:31:41

@s_ha_dum это предложение - настоящая жемчужина в двух словах. :) Оно объясняет всё. Я пробовал множество способов - все эти хуки wp_loaded, template_redirect и прочее, но ничего не работало. Большое спасибо.

Mayeenul Islam Mayeenul Islam
27 апр. 2015 г. 08:44:10