Функция wp_redirect() не работает
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);
}

Две ошибки здесь:
- Не используйте
$post->guid
как URL - Вы обязаны вызывать
exit()
после использованияwp_redirect()
(см. Codex)
wp_redirect()
не завершает выполнение автоматически, и почти всегда должен сопровождаться вызовом exit. Для перенаправления на страницу новой записи:
//..... код как в вопросе
$post_id = wp_insert_post($new_post);
$url = get_permalink( $post_id );
wp_redirect($url);
exit();

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

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

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

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

У меня есть простое решение, пожалуйста, прочитайте:
Если вы используете
wp_redirect($url)
в файлах темы, и это не работает, добавьтеob_clean() ob_start()
в ваш файл functions.php в самом начале.Если используете в плагине, добавьте
ob_clean() ob_start()
в главный файл плагина в самом начале.
И убедитесь, что вы добавили exit() после wp_redirect($url)
Вот так:
$url = 'http://example.com';
wp_redirect($url);
exit();

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

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

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

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

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

Не уверен, что это поможет... но я обнаружил, что у меня был код в шаблоне, и я начинал с get_header() вот так:
<?php
/**
* .. Комментарии к шаблону
*/
get_header();
if(...) {
...
if(...) {
...
wp_redirect($url);
exit();
}
}
?>
и получал ту же проблему с заголовками, отправленными ранее... Что я сделал — просто переместил get_header() в конец блока, и вуаля!!!
<?php
/**
* .. Комментарии к шаблону
*/
if(...) {
...
if(...) {
...
wp_redirect($url);
exit();
}
}
get_header();
?>
Никакие плагины не были отключены, и всё работало нормально... можете попробовать, если это сработает для вас.

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

Никогда не используйте значение 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 для проверки.

У меня были такие же проблемы,
Я пробовал разные методы, например:
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');
Примечание: я использую дочернюю тему

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

Убедитесь, что у вас нет: get_header();
или любых других функций WordPress, которые потенциально создают контент, например, шапку или подвал, в вашем шаблоне. Иначе перенаправление не сработает.
Некоторые разработчики пытаются очистить страницу с помощью ob_start();
, но если на странице есть контент, даже при использовании ob_start();
перенаправление не будет работать.
Затем просто попробуйте этот код:
wp_redirect(get_permalink($post->ID));
exit;

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(); // Завершаем выполнение скрипта
}
}
