Pull to refresh

Мистический баг последнего Вордпресса старой Оперы 8.5

Reading time 3 min
Views 715
Четыре ночных часа потратил на поиск информации. В итоге пришлось опять самому разбираться в коде, вооружившись самоучителем и интернетом.

Готовим к запуску корпоративный блог. Как примерный пацан, скачал я последнюю версию Wordpress с официального сайта, чтобы содержала она все необходимые патчи безопасности. Там как раз недавно выпустили какую-то стабильную версию. Ставлю. Радуюсь. Начинаю тестировать.

Добавляю комментарии. В IE все хорошо. В Firefox все хорошо. Начинаю тестировать в Opera… опаньки. После отправки комментария гостем страница не обновляется. Нажимаю F5, чтобы обновить ее вручную. Вижу, что комментарий в базу-то попал. На других моих блогах такого нет (там и версия Wordpress постарше).

Начинаю копаться. Ставлю другую тему. Все так же. Ставлю набор плагинов от другого блога. Никаких изменений. Сношу и переустанавливаю Wordpress. Баг остался. На чужих блогах вижу такой же, но я же не хочу, чтобы у меня такое осталось, тем более на корпоративном блоге.

Ищем в «Яндексе». Ничего. Ищем в Google. Ищем на сайте Wordpress. Огромное количество сообщений о багах, на которые не отвечают уже месяцев по 7-8. Свободный софт, елки. В общем, поиски результатов не дали (обычно хватает минут 20, чтобы найти ответ).

Имея уже опыт поддержки и развития одного программного продукта, понимаю: проблема именно в обновленной версии. Догадка подтвердилась установкой старого Wordpress. Все заработало.

Понеслась. Теперь знаю, что дело, скорее всего, в одной из функций из файла wp-comments-post.php (он принимает комменты). Сперва пытаюсь просто подменить его файлом из старой версии. Перестает работать вообще. Начинаю копаться в этом файле. Я не программер, чужой код понимаю через раз. Догадываюсь, что он сперва что-то такое делает, а потом перенаправляет пользователя на страницу с ответом.

В конце вижу такую конструкцию:

$location = ( empty($_POST['redirect_to'])? get_permalink($comment_post_ID): $_POST['redirect_to'] ). '#comment-'. $comment_id;
$location = apply_filters('comment_post_redirect', $location, $comment);
wp_redirect($location);

Не знаю, почему я за нее зацепился. Сравниваю со старым Wordpress:

$location = ( empty( $_POST['redirect_to'] ) )? get_permalink( $comment_post_ID ): $_POST['redirect_to'];
wp_redirect( $location );

Сперва подумал, что дело в apply_filters. Закомментировал. Проблема осталась. Смотрю на вот эту конструкцию (?: ) примерно минут 10 (в самоучителе не нашел, что за операция двоеточием делается). Ищу, что такое empty. Оказывается, это функция, которая проверяет, не является ли пустым ее аргумент. Тут я начинаю понимать, что эта конструкция проверяет какое-то условие, и в зависимости от него, формирует ссылку для редиректа. А «redirect_to», оказывается, какое-то скрытое поле формы, которое можно подставить в свою тему и сказать движку, куда после комментария отправлять пользователя. В темах «Вордпресса» в comments.php такого поля исходно я не нашел.

И тут я замечаю, что в предыдущей версии скобочка стоит в другом месте. Решил попробовать заменить эту конструкцию со скобками на ту, что в предыдущем «Вордпрессе». Заработало вроде.

Я так и не понял, чего это я там накрутил и почему оно заработало. Было:

$location = ( empty($_POST['redirect_to'])? get_permalink($comment_post_ID): $_POST['redirect_to'] ). '#comment-'. $comment_id;

Стало:

$location = ( empty( $_POST['redirect_to'] ) )? get_permalink( $comment_post_ID ): $_POST['redirect_to']. '#comment-'. $comment_id;

Теперь куда-то пропадает «хвост», который редиректит не просто на страницу, а именно к добавленному комментарию. Пытаемся заключить скобочную конструкцию в еще одни скобки:

$location = (( empty( $_POST['redirect_to'] ) )? get_permalink( $comment_post_ID ): $_POST['redirect_to']). '#comment-'. $comment_id;

В IE и FF работает, а Опера снова перестала обновлять страницу. Висит курсорчик, изображается какая-то загрузка, и все. В итоге пришел к такому варианту:

$location = ( empty( $_POST['redirect_to'] ) )? get_permalink( $comment_post_ID ): $_POST['redirect_to'];
$location = $location. '#comment-'. $comment_id;

Но это еще не все!!!

Добавляю один комментарий, второй. И тут опа! Баг возвращается. Пробую поставить перед решеткой слеш. Добавляются. Следующий коммент — снова не обновляется страница. Убираю слэш. Добавляется. Следующий коммент — снова баг.

Кто-то может сказать, в чем там было дело? И еще, я так и не понял, почему этот баг проявляется только в Opera и только в Wordpress 2.2?
Tags:
Hubs:
+1
Comments 17
Comments Comments 17

Articles