Функция wp_redirect() не работает

21 мар. 2012 г., 16:31:50
Просмотры: 122K
Голосов: 12

wp_redirect($post->guid) не работает. Как это можно исправить?

Вот мой код:

if(isset($_REQUEST['vid']) ){

    $id=$_REQUEST['vid'];

    $post_title = 'sasa';

    $post_content ='zxczxczxc';

    $new_post = array(
      'ID' => '',
      'post_author' => $user->ID, 
      'post_content' => $post_content,
      'post_title' => $post_title,
      'post_status' => 'publish',
      // УЖЕ ЯВЛЯЕТСЯ МАССИВОМ

    );

    $post_id = wp_insert_post($new_post);

    // Это перенаправит вас на только что созданный пост
    $post = get_post($post_id);
    $url=$post->guid;

    wp_redirect($post->guid);

} 
0
Все ответы на вопрос 9
6
29

Две ошибки здесь:

  1. Не используйте $post->guid как URL
  2. Вы обязаны вызывать exit() после использования wp_redirect() (см. Codex)

wp_redirect() не завершает выполнение автоматически, и почти всегда должен сопровождаться вызовом exit. Для перенаправления на страницу новой записи:

//..... код как в вопросе
$post_id = wp_insert_post($new_post);
$url = get_permalink( $post_id );
wp_redirect($url);
exit();
21 мар. 2012 г. 16:44:52
Комментарии

Опередил тебя на 30 секунд :D

soulseekah soulseekah
21 мар. 2012 г. 16:45:19

это не работает, если я запускаю страницу, консоль показывает 302 Found 479ms jquery...r=1.7.1 (строка 4) GET http://localhost/wordpress/newpages-17/

200 OK 1.2s загрузка..........

SANS780730 SANS780730
21 мар. 2012 г. 16:51:56

Это ошибка JS. Ничего общего с wp_redirect. Приведенный выше ответ - правильный способ сделать это, так что, вероятно, ты делаешь что-то еще не так.

Stephen Harris Stephen Harris
21 мар. 2012 г. 17:00:46

sorry.it показывает только GET localhost/wordpress/newpages-17 200 OK 1.2s загрузка..........

SANS780730 SANS780730
21 мар. 2012 г. 17:04:01

@StephenHarris, не мог бы ты взглянуть на мой вопрос по редиректу на http://wordpress.stackexchange.com/q/76991/10413? Я также пробовал твой код из этого ответа с использованием $pid, но всё равно не получается заставить его работать. Спасибо.

Anagio Anagio
22 дек. 2012 г. 19:33:49

Этот вопрос получает огромное количество просмотров, поэтому, пожалуйста, рассмотрите возможность принять этот ответ, если он решил вашу проблему. Таким образом, вопрос будет отмечен как решённый, что поможет нам поддерживать порядок на сайте. Спасибо.

Andy Macaulay-Brook Andy Macaulay-Brook
23 июл. 2016 г. 18:06:47
Показать остальные 1 комментариев
6
14

У меня есть простое решение, пожалуйста, прочитайте:

  1. Если вы используете wp_redirect($url) в файлах темы, и это не работает, добавьте ob_clean() ob_start() в ваш файл functions.php в самом начале.

  2. Если используете в плагине, добавьте ob_clean() ob_start() в главный файл плагина в самом начале.

И убедитесь, что вы добавили exit() после wp_redirect($url) Вот так:

$url = 'http://example.com';
wp_redirect($url);
exit();
10 дек. 2015 г. 07:16:25
Комментарии

Это решает проблему с Mozilla Firefox, который возвращает 200 вместо 302 для выполнения перенаправления. Chrome выполняет перенаправление, а Firefox — нет. Это исправление помогает. Спасибо!

El'Magnifico El'Magnifico
12 сент. 2018 г. 16:36:49

Это более подробный ответ, если вы создаете плагин или разрабатываете шаблон. Сработало для меня.

Sayed Mohd Ali Sayed Mohd Ali
10 июл. 2019 г. 11:43:04

Я долго пытался заставить это работать в моей пользовательской теме... Работает как часы...

ShivangiBilora ShivangiBilora
8 окт. 2019 г. 13:24:54

Обратите внимание, что, как упоминалось в другом ответе, в шаблонах необходимо выполнять проверку входа и перенаправление до функции 'get_header()', либо разместить функцию проверки входа в add_filter('init','mylogincheck') в вашем шаблоне. В противном случае возникнет ошибка 'headers already sent', которая может не отображаться в журнале ошибок (в зависимости от настроек ошибок).

Rick Hellewell Rick Hellewell
27 мар. 2022 г. 23:46:26

Сработало! В вежливости к другим разработчикам убедитесь, что вызываете ob_clean второй раз. ob_clean();ob_start(); /*plugin code*/ ob_clean();

wizardzeb wizardzeb
30 июн. 2022 г. 04:36:31

Если используете в плагине, добавьте ob_clean() ob_start() в главном файле плагина в начале. Этот код сработал только у меня.

M.Idrish M.Idrish
27 февр. 2023 г. 11:24:12
Показать остальные 1 комментариев
3

Не уверен, что это поможет... но я обнаружил, что у меня был код в шаблоне, и я начинал с get_header() вот так:

<?php
/**
 * .. Комментарии к шаблону
 */

 get_header();

 if(...) {
    ...
    if(...) {
      ...
      wp_redirect($url);
      exit();
    }
 }
 ?>

и получал ту же проблему с заголовками, отправленными ранее... Что я сделал — просто переместил get_header() в конец блока, и вуаля!!!

<?php
/**
 * .. Комментарии к шаблону
 */


 if(...) {
    ...
    if(...) {
      ...
      wp_redirect($url);
      exit();
    }
 }
 get_header();
 ?>

Никакие плагины не были отключены, и всё работало нормально... можете попробовать, если это сработает для вас.

1 мая 2013 г. 20:53:18
Комментарии

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

s_ha_dum s_ha_dum
1 мая 2013 г. 21:28:32

Удаление get_header() также сработало у меня!

Magico Magico
31 окт. 2014 г. 12:01:31

Готов поспорить, что это самая распространенная причина, по которой у большинства людей не работает wp_redirect

joehanna joehanna
25 февр. 2019 г. 07:53:49
2

Никогда не используйте значение GUID записи, оно не должно соответствовать реальному URL записи.

http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note

wp_redirect( get_permalink( $post_id ) );
exit(); // всегда завершайте выполнение

Также убедитесь, что функция wp_redirect не переопределена чем-то другим, что мешает её корректной работе. Отключите все плагины и переключитесь на тему Twenty Ten/Eleven для проверки.

21 мар. 2012 г. 16:44:21
Комментарии

+1 хорошее замечание насчет того, что wp_redirect является подключаемым

Stephen Harris Stephen Harris
21 мар. 2012 г. 16:47:17

спасибо....

SANS780730 SANS780730
21 мар. 2012 г. 18:49:04
1

У меня были такие же проблемы,
Я пробовал разные методы, например:

add_action( 'init', 'my_function_name'); или add_action( 'wp_head', 'my_function_name'); но это не работало

В итоге я нашел хук, который идеально работает для редиректа,
ниже мой полный код в файле functions.php:

function redirect_homepage(){
    ob_clean();
    ob_start();
    $args = array(
        'public'   => true,
        '_builtin' => false,
     );
    
     $output = 'names'; // names или objects, по умолчанию используется names
     $operator = 'and'; // 'and' или 'or'
    
     $post_types = get_post_types( $args, $output, $operator ); 
        if(is_singular($post_types)){

            $url = get_bloginfo('url');
            wp_redirect($url, '301');
            exit();
    }
}
add_action( 'template_redirect', 'redirect_homepage');

Просто используйте хук add_action( 'template_redirect', 'my_function_name');

Примечание: я использую дочернюю тему

7 мар. 2021 г. 06:25:11
Комментарии

Огромное спасибо! Перепробовал множество комбинаций с wp_redirect, exit, die, header. Помогло ob_clean(); ob_start(); в начале!

Galina Bublik Galina Bublik
13 сент. 2022 г. 08:46:25
0

Ошибка "заголовки уже отправлены" является основной причиной. Поскольку заголовки уже отправлены, невозможно отправить их повторно, что приводит к сбою перенаправления. Используйте до отправки заголовков, например, в хуке init.

add_action('init', 'your_app_function');
22 июл. 2020 г. 10:57:19
0

Убедитесь, что у вас нет: get_header(); или любых других функций WordPress, которые потенциально создают контент, например, шапку или подвал, в вашем шаблоне. Иначе перенаправление не сработает.

Некоторые разработчики пытаются очистить страницу с помощью ob_start();, но если на странице есть контент, даже при использовании ob_start(); перенаправление не будет работать.

Затем просто попробуйте этот код:

wp_redirect(get_permalink($post->ID));
exit;
16 янв. 2019 г. 23:33:18
1
if( is_page( ['wfp-dashboard', 'wfp-checkout'] ) ){ // Проверяем, является ли текущая страница 'wfp-dashboard' или 'wfp-checkout'
   if(!is_user_logged_in()){ // Если пользователь не авторизован
      @ob_flush(); // Сбрасываем буфер вывода
      @ob_end_flush(); // Завершаем и сбрасываем буфер вывода
      @ob_end_clean(); // Очищаем буфер вывода
      wp_redirect( wp_login_url() ); // Перенаправляем на страницу входа
      exit(); // Завершаем выполнение скрипта
   }
}
6 авг. 2019 г. 09:28:06
Комментарии

Можете добавить объяснение, как это исправляет проблему? Я не совсем понимаю, почему в коде используются буферы вывода, и там есть оператор @, а @ не предотвращает ошибки, а просто скрывает их из лога ошибок

Tom J Nowell Tom J Nowell
22 июл. 2020 г. 11:53:14
0

Просто заметил, что для работы этого плагин W3 Total Cache должен быть активен. По какой-то причине он отключил мой.

wp_redirect("/");
exit;
28 дек. 2022 г. 19:53:38