Я провел четыре часа ночи в поисках информации.
В итоге мне пришлось заново разбираться в коде, вооружившись учебником и интернетом.
Готовимся к запуску корпоративного блога.
Я как хороший парень скачал с официального сайта последнюю версию Wordpress, чтобы в ней были все необходимые патчи безопасности.
Они только недавно выпустили какую-то стабильную версию.
Бьюсь об заклад. Я счастлив.
Я начинаю тестировать.
Добавляю комментарии.
В IE все в порядке.
В Фаерфоксе все в порядке.
Начинаю тестировать в Опере.
упс.
После того как гость оставляет комментарий, страница не обновляется.
Я нажимаю F5, чтобы обновить его вручную.
Я вижу, что комментарий вошел в базу данных.
В других моих блогах этого нет (у них также есть более старая версия Wordpress).
Я начинаю копать.
Я поставлю другую тему.
Все так же.
Я устанавливаю набор плагинов из другого блога.
Без изменений.
Я удаляю и переустанавливаю Wordpress. Баг остался.
То же самое я вижу и в чужих блогах, но не хочу, чтобы что-то подобное осталось со мной, особенно в корпоративном блоге.
Ищем его в Яндексе.
Ничего.
Ищем в Google. Ищем его на сайте Wordpress. Огромное количество багрепортов, на которые нет ответа уже 7-8 месяцев.
Бесплатное программное обеспечение, новогодние елки.
В общем, поиск не дал никаких результатов (обычно 20 минут достаточно, чтобы найти ответ).
Имея уже опыт поддержки и развития одного программного продукта, я понимаю, что проблема кроется в обновленной версии.
Догадка подтвердилась установкой старого Wordpress. Все работало.
Поехали.
Теперь я знаю, что проблема скорее всего в одной из функций из файла wp-comments-post.php (он принимает комментарии).
Сначала просто пытаюсь заменить файлом из старой версии.
Перестает работать вообще.
Я начинаю копаться в этом файле.
Я не программист, время от времени разбираюсь в чужом коде.
Я предполагаю, что он сначала делает что-то вроде этого, а потом перенаправляет пользователя на страницу с ответом.
В конце я вижу такую конструкцию: $location = (пусто($_POST['redirect_to'])? get_permalink($comment_post_ID): $_POST['redirect_to']).
'#комментарий-'.
$ комментарий_ид; $location = apply_filters('comment_post_redirect', $location, $comment); wp_redirect ($ местоположение); Я не знаю, почему я на нее подсела.
Сравните со старым Wordpress: $location = (пусто($_POST['redirect_to']))? get_permalink($comment_post_ID): $_POST['redirect_to']; wp_redirect($location); Сначала я подумал, что это как-то связано с apply_filters. Прокомментировал это.
Проблема все еще существует. Я рассматривал эту конструкцию (?: ) около 10 минут (не смог найти в туториале, какая операция производится с двоеточием).
Я ищу, что такое пустота.
Оказывается, это функция, которая проверяет, пуст ли ее аргумент. Тут я начинаю понимать, что эта конструкция проверяет какое-то условие и в зависимости от него генерирует ссылку для редиректа.
А «redirect_to», оказывается, — это какое-то скрытое поле формы, которое вы можете вставить в свою тему и сообщить движку, куда направить пользователя после комментария.
Я изначально не нашел такого поля в темах WordPress в comment.php. И тут я замечаю, что в предыдущей версии кронштейн стоит в другом месте.
Я решил попробовать заменить эту конструкцию со скобками на ту, что была в предыдущем WordPress. Кажется, это сработало.
Я до сих пор не понимаю, что я там напортачил и почему это сработало.
Был: $location = (пусто($_POST['redirect_to'])? get_permalink($comment_post_ID): $_POST['redirect_to']).
'#комментарий-'.
$ комментарий_ид; Стал: $location = (пусто($_POST['redirect_to']))? get_permalink($comment_post_ID): $_POST['redirect_to'].
'#комментарий-'.
$ комментарий_ид; Теперь куда-то пропадает «хвост», который перенаправляет не просто на страницу, а на добавленный комментарий.
Пытаемся заключить скобочную конструкцию еще в одну скобку: $location = ((пусто($_POST['redirect_to']))? get_permalink($comment_post_ID): $_POST['redirect_to']).
'#комментарий-'.
$ комментарий_ид; В IE и FF работает, но Opera снова перестала обновлять страницу.
Курсор висит, отображается какая-то загрузка и всё.
В итоге я пришел к такому варианту: $location = (пусто($_POST['redirect_to']))? get_permalink($comment_post_ID): $_POST['redirect_to']; $location = $location. '#комментарий-'.
$ комментарий_ид; Но это еще не все!!! Добавляю один комментарий, потом второй.
И тогда опа! Баг вернулся.
Я пытаюсь поставить косую черту перед хешем.
Добавляются.
Следующий комментарий заключается в том, что страница больше не обновляется.
Я убираю косую черту.
Добавлен.
Следующий комментарий - снова ошибка.
Может кто-нибудь сказать мне, в чем дело? И еще, я до сих пор не понимаю, почему этот баг появляется только в Опере и только в Wordpress 2.2? Теги: #wordpress #Wordpress #ошибки #Чулан
-
Почему Не Понятие
19 Oct, 24 -
Регистрация Открыта
19 Oct, 24 -
Вирусные Кампании В Твиттере
19 Oct, 24