Плагин Redirect от Nick Berlette

Vladimir
Опубликовано в: Плагины

Десять строк кода, две ошибки

Сегодня по долгу работы пришлось столкнуться с плагином Redirect от Nick Berlette. Плагин выполняет перенаправление на URL, заданный в Произвольных полях записи или страницы. Сам по себе плагин простой — кода всего 10 строк. Я бы на него даже не обратил внимание, если бы CLI-скрипт не вернул фатальную ошибку.

Пришлось лезть в код и разбираться. В результате на 10 строк кода была найдена одна серьёзная ошибка, недосмотр, приводящий к выполнению лишних запросов/PHP-кода, использован неверный хук и код, который не будет корректно работать со старым IIS. Это всё на 10 строк кода :-)

Код плагина стоит разобрать, чтобы авторы плагинов учились на чужих ошибках:

[-]
View Code PHP
  1.         require_once($_SERVER['DOCUMENT_ROOT'] . '/wp-config.php');
  2.         add_action('get_header', 'redirect');
  3.         function redirect () {
  4.                 global $post;
  5.                 if (is_page() || is_object($post)) {
  6.                         if (get_post_meta($post->ID, 'redirect', true)) {
  7.                                 header('Location: ' . get_post_meta($post->ID, 'redirect', true));
  8.                         }
  9.                 }
  10.         }

Начнём с первой строки.
Во-первых, $_SERVER['DOCUMENT_ROOT'] определён, если PHP работает как модуль Web-сервера. Если же у Вас есть cron-скрипт, который подключает wp-config.php и исполняется CLI-интерфейсом, то фатальная ошибка обеспечена (CLI не определяет серверные переменные, что весьма логично).

Во-вторых, wp-config.php может лежать за пределами Document Root, и для версий 2.7.x правильно подключать wp-load.php.

В-третьих, плагины загружаются из wp-settings.php, который подключается из wp-config.php. Поэтому необходимости в повторном включении wp-config.php просто нет.

Переходим ко второй строке. Событие get_header случается, когда шаблон темы обращается к WordPress с просьбой загрузить header.php темы. Это немного поздно. Лучшим решением было бы обработка события wp_init или template_redirect.

Следующие две ошибки в седьмой строке.

Для старых версий IIS редирект нужно посылать несколько иначе. Это первое. И второе: в WordPress есть функция, которая ведает всеми тонкостями перенаправления, поэтому предпочтительнее использовать её (wp_redirect()). Ведь если что, то проще в одном месте код поправить, чем делать полнотекстовый поиск по всем файлам.

Вторая ошибка — отправка заголовка Location не завершает работу скрипта. Да, браузер последует на требуемую страницу, но на сервере также выполнится весь код, который идёт после того злополучного header(). Только результат выполнения никому не нужен. Поэтому после вызова header() или wp_redirect() нужно в таких случаях ставить die().

Закончу словами автора: great, ain’t it?

Добавить в закладки

Связанные записи

15
Май
2009

Комментарии к статье «Плагин Redirect от Nick Berlette» (3)  »

  1. [...] тему об ошибках при написании плагинов: основная ошибка состоит в том, что плагин [...]

  2. Пятигорец says:

    Здравствуйте Владимир!
    Я недавно поставил этот плагин для того, чтобы старые ссылки на посты и картинки делали корректный редирект. Но в силу отсутствия знаний английского и после того как я прочел этот пост усомнился в правильности выбора плагина. У меня есть ещё один блог в котором нужно будет сделать кучу редиректов, но я даже теперь и не знаю какой плагин для этого лучше поставить. Что можете посоветовать?
    Спасибо!
    p.s. Вы писали про ошибки автору плагина?

    • Vladimir says:

      Пятигорец, при штатной работе плагина глюки не проявляются, так что можете спокойно его использовать.

Подписаться на RSS-ленту комментариев к статье «Плагин Redirect от Nick Berlette» Trackback URL: http://blog.sjinks.org.ua/wordpress/plugins/558-redirect-plugin-by-nick-berlette/trackback/

Оставить комментарий к записи «Плагин Redirect от Nick Berlette»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя