wp_redirect не работает после отправки формы
-
-
Трудно что-либо предположить из этой информации,вы пытались отладить ее для получения дополнительных сведений?Плагин [Better HTTP Redirects] (http://wordpress.org/extend/plugins/better-http-redirects/) - хороший инструмент для решения проблем с перенаправлением.Hard to guess anything from this information, have you tried to debug it for more details? [Better HTTP Redirects](http://wordpress.org/extend/plugins/better-http-redirects/) plugin is good tool to look into redirect issues.
- 2
- 2012-12-22
- Rarst
-
Пожалуйста,разместите этот код в контексте.Please post this code in context.
- 0
- 2012-12-22
- s_ha_dum
-
@s_ha_dum Я обновил свой вопрос,добавив в негоpastebin@s_ha_dum I've updated my question to include a pastebin
- 0
- 2012-12-22
- Anagio
-
@Rarst Я обновил вопрос с помощьюpastebin всего кода@Rarst I've updated the question with a pastebin of the entire code
- 0
- 2012-12-22
- Anagio
-
@Rarst Я установил плагин,пожалуйста,посмотрите мой обновленный пост,в нем отображается 302 и ссылки на новый пост,но не обновляются там@Rarst I installed the plugin please see my updated post it displays a 302 and links to the new post but doesn't refresh there
- 0
- 2012-12-22
- Anagio
-
2 ответ
- голосов
-
- 2012-12-22
Вы можете использовать
wp_redirect
только перед отправкой содержимого в браузер. Если бы вы включили отладкуphp,вы бы увидели ошибку «заголовки уже отправлены» из-заget_header()
в первой строке.Вместо того,чтобы обрабатывать форму в шаблоне,вы можете подключить более раннее действие ,например
wp_loaded
и сохраните некоторые запросы в базе данных,если вы просто собираетесь перенаправить.ИЗМЕНИТЬ ,пример-
add_action( 'wp_loaded', 'wpa76991_process_form' ); function wpa76991_process_form(){ if( isset( $_POST['my_form_widget'] ) ): // process form, and then wp_redirect( get_permalink( $pid ) ); exit(); endif; }
Используя действие,вы можете отделить код от ваших шаблонов. Объедините это с коротким кодом для вывода формы и оберните все это в класс,чтобы сохранить состояние между обработкой/выводом,и вы можете делать все это,не касаясь шаблонов внешнего интерфейса.
You can only use
wp_redirect
before content is sent to the browser. If you were to enable php debugging you'd see a "headers already sent" error due toget_header()
on the first line.Rather than process the form in the template, you can hook an earlier action, like
wp_loaded
, and save some queries to the db if you're just going to redirect away.EDIT, example-
add_action( 'wp_loaded', 'wpa76991_process_form' ); function wpa76991_process_form(){ if( isset( $_POST['my_form_widget'] ) ): // process form, and then wp_redirect( get_permalink( $pid ) ); exit(); endif; }
Using an action, you can keep the code out of and separated from your templates. Combine this with a shortcode to output the form and wrap it all in a class to save state between processing/output, and you could do it all without touching the front end templates.
-
@Miloe да,я только что видел заголовки,которые уже отправили сообщение,теперь с включенной отладкой и включенным лучшим плагином перенаправления http.Я не знаком с тем,как использовать хуки,не могли бы вы указать мне на какой-нибудь учебник или показать пример кода,пожалуйста@Miloe yes I just saw the headers already sent message now with debugging enabled and the better http redirect plugin on. I'm not familiar with how to use the hooks, can you point me to some tutorial or show some example code please
- 0
- 2012-12-22
- Anagio
-
@Anagio - добавил пример@Anagio - added an example
- 0
- 2012-12-22
- Milo
-
Спасибо,поэтому вы предлагаете поместить форму в короткий код,а затем использовать do_shortcode () в шаблоне для отображения формы.Хук войдет в мойfunctions.php.Во что превратится действие формы для запуска функции/перехвата?Thanks, so your suggesting I put the form into a short code then use do_shortcode() within the template to display the form. The hook would go into my functions.php. What does the action of the form become to fire the function/hook?
- 0
- 2012-12-23
- Anagio
-
вам не нужно было бы использовать do_shortcode,я хотел сказать,что вы можете добавить его через шорткод к содержимому сообщения/страницы,тогда весь ваш код обработки и рендеринга будет отделен от шаблона,таким образом форма может работать на любомстраницы вы помещаете шорткод формы в содержимое.действие может быть просто нацелено на текущую страницу с помощью символа `#` или быть пустым,поскольку вы подключаете * все * запросы,чтобы проверить,была ли отправлена ваша форма,она будет работать с/на любой странице.you wouldn't have to use `do_shortcode`, my point was that you could add it via a shortcode to a post/page's content, then all your processing and rendering code is separated from the template, that way the form could work on any page you place the form's shortcode within the content of. the action can just target the current page with a `#`, or be blank, since you're hooking *all* requests to check if your form was submitted, it will work from/to any page.
- 1
- 2012-12-23
- Milo
-
@Milo,ты прибил это для меня."заголовки уже отправлены" было для меня проблемой.благодаря@Milo you nailed this for me. "headers already sent" was the problem for me. Thanks
- 0
- 2013-09-24
- henrywright
-
- 2012-12-22
Перемещение
get_header();
в конец этого кода должно решить проблему.Ваш код будет выполнен до того,как будут отправлены какие-либо заголовки,и перенаправление будет работать.// ... wp_redirect( get_permalink($pid) ); exit(); //insert taxonomies } get_header(); ?>
Я полагаю,на странице под тем,что вы опубликовали,больше кода?Если нет,я вообще не вижу необходимости в
get_header()
.Единственное преимущество,которое я вижу в использовании крючка,как предлагает Майло,состоит в том,что вы можете избежать некоторых накладных расходов,если выберете достаточно ранний крючок.Вы можете сократить время обработки на долю секунды
Moving
get_header();
to the bottom of that code should fix the problem. Your code will execute before any headers are sent and the redirect will work.// ... wp_redirect( get_permalink($pid) ); exit(); //insert taxonomies } get_header(); ?>
I assume there is more code on the page below what you posted? If not I don't see the need for
get_header()
at all.The only benefit I can see to using a hook as Milo suggests is that you might be able to avoid some overhead if you pick an early enough hook. You could shave a fraction of a second off of processing.
-
Да,есть HTML,и еще несколько wp-функцийget_sidebars (),get_footer () и т.д. Я совсем не знаком с использованием хуков,но очень хотел бы увидеть пример.Я уже гуглил и вижу,как люди говорят о `add_action ('wp_loaded','your_function')`,но действительно не знают,как его использовать.Любые примеры приветствуются,спасибоYes there's some HTML, and some more wp functions get_sidebars(), and get_footer() etc. I'm not at all familiar with using hooks but would really like to see an example. I'm already googling and see people talking about `add_action('wp_loaded', 'your_function')` but really not sure how to use it. Any examples is appreciated thanks
- 0
- 2012-12-22
- Anagio
-
Я подожду немного и посмотрю,опубликует ли @Milo пример с использованием ловушки,поскольку это его ответ.Если нет,то отредактирую свой ответ.I'll wait awhile and see if @Milo posts an example using a hook, since that is his answer. If not, I'll edit my answer.
- 0
- 2012-12-22
- s_ha_dum
-
Спасибо,что переместилиget_header () под код обработки формы,и перенаправление сработало.Я бы хотел посмотреть,как пользоваться крючком.Thanks moving the get_header() below the form handling code and redirect worked. I would like to see how to use the hook though.
- 0
- 2012-12-22
- Anagio
-
@s_ha_dum,это предложение - в двух словах,кусок алмаза.:) Это все объяснило.Я пробовал много способов - все,что угодно,`wp_loaded`,`template_redirect`,но не смог заставить все работать.Большое спасибо.@s_ha_dum that piece of suggestion is a piece of diamond in a nutshell. :) It explained everything. I tried a lots of ways - all the `wp_loaded`, `template_redirect` things, but could not make things work. Thanks a lot.
- 0
- 2015-04-27
- Mayeenul Islam
Я использую это перенаправление после вставки сообщения.Он не работает,он только обновляет страницу,на которой находится форма.Я знаю,что $pid получает идентификатор сообщения,в чем проблема?Это самый конец моегоphp-кода для обработки отправки формы.
Вот pastebin полного кода
Использование улучшенного перенаправления HTTP,который выводится,и он связывает слово
here
с правильным недавно опубликованным сообщением.