Где нужно разместить wp_redirect, чтобы он работал?

17 мая 2012 г., 19:23:24
Просмотры: 14.1K
Голосов: 7

У меня есть страница редактирования поста на фронтенде по адресу mysite/post_id/edit, и я пытаюсь перенаправить пользователей, не являющихся авторами, обратно к посту. Вот код, с которым я работаю:

    <?php
    global $current_user; get_currentuserinfo();
    if($post->post_author != $current_user->ID):
    wp_redirect( the_permalink() ); exit;
    ?>

Проблема в том, что вместо перенаправления просто отображается постоянная ссылка поста.

wp_redirect говорит: "wp_redirect не будет вызван, если страница уже начала загружаться, поэтому убедитесь, что вызываете его выше." - но даже после размещения кода в самом начале файла header.php я все равно получаю ту же проблему с отображением ссылки вместо перенаправления.

Где нужно правильно разместить этот код, чтобы перенаправление работало?

Заранее спасибо!

EDIT: Попробовал что-то по совету milo, но сначала проверю рекомендации Tommix перед обновлением поста Milo.

0
Все ответы на вопрос 3
2
15

Когда вы находитесь в шаблоне, уже слишком поздно, так как заголовки уже отправлены. Вам нужно подключиться раньше в процессе запроса, например, используя хук template_redirect:

add_action( 'template_redirect', 'wpse52455_redirect' );

function wpse52455_redirect(){
    // выполните проверку и вызовите wp_redirect здесь
}

Обратите внимание, что это будет вызываться при каждом запросе, поэтому вам также нужно проверить, что текущая страница является страницей редактирования.

РЕДАКТИРОВАНИЕ - приведённый выше код должен быть помещён в файл functions.php вашей темы.

17 мая 2012 г. 19:57:19
Комментарии

Должны ли и add_action, и функция быть размещены в functions.php?

Stephen S. Stephen S.
17 мая 2012 г. 20:43:55

@StephenS. да, оба в functions.php.

Milo Milo
17 мая 2012 г. 20:46:23
0
-2

Возможно, вам потребуется добавить 'приоритет' к вызову действия. Например:

add_action('template_redirect', 'user_logged_in', 1, 1);
3 авг. 2014 г. 16:38:58
6
-3

Полностью рабочий ОТВЕТ:

global $current_user; get_currentuserinfo();
if($post->post_author != $current_user->ID){
wp_redirect(get_post_permalink($post->ID)); 
 exit();
}
17 мая 2012 г. 20:51:26
Комментарии

Этот текущий код возвращает ошибку Cannot modify header information - headers already sent by

Stephen S. Stephen S.
17 мая 2012 г. 21:21:54

Странно, у меня отлично работает. Я добавил его в файл single.php. Возможно, ваш файл уже что-то выводит? Поместите код как можно выше в начале php-файла. Конечно, он также должен получать $post, потому что если он его не получит, то не узнает, является ли пользователь автором, поэтому он должен идти после того, как переменная $post получит данные. Потому что код хороший, просто неправильное размещение :) Может, вы поместили этот код во включаемом файле?

Tommixoft Tommixoft
17 мая 2012 г. 21:26:14

Ты прав - у меня частично работает - хотя, что странно, он перенаправляет, когда ($post->post_author == $current_user->ID), а не когда ($post->post_author != $current_user->ID)

Stephen S. Stephen S.
17 мая 2012 г. 21:52:21

что произойдет, если попытаться использовать $post->post_author !== $current_user->ID

Tommixoft Tommixoft
17 мая 2012 г. 21:58:43

понял, не получается получить $post->author, потому что эта переменная еще не была установлена на этом этапе загрузки страницы

Stephen S. Stephen S.
17 мая 2012 г. 23:10:58

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

Tommixoft Tommixoft
18 мая 2012 г. 00:07:41
Показать остальные 1 комментариев