Містичний стіл останнього Вордпресса старої Опери 8.5
Чотири нічні години витратив на пошук інформації. У підсумку довелося знову самому розбиратися в коді, озброївшись самовчителем та інтернетом.
Готуємо до запуску корпоративний блог. Як зразковий пацан, завантажив я останню версію 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?
