Wordpress RSS-feeds time fix

Wordpress RSS-feeds time fix

Днес, след конференцията на linux-bg.org Emerald ме попита какви настройки на WordPress трябва да смени, за да се визуализират читаво във времето RSS-фийдовете от нейния блог на open-culture.net. И понеже проблемът е много масов ще взема да отговоря публично.

Всъщност проблемът не е в настройките. В General секцията на Options менюто на административния интерфейс на всеки WordPress следва да се зададе просто вярната часова зона, в която се намира сървърът, който хоства сайта ви, като отклонение от Гринуич. Ако машината се намира в България, тя най-вероятно тиктака като нас по българско време. Някои администратори пускат сървърите си по Гринуич или UTC, но за това обикновено си има нарочни причини и е относително рядко срещано. България е в EET-зоната (Eastern European Time), която е +2 часа от Гринуич. Т.е. всичко, което трябва да бъде зададено в WordPress опциите е:

Times in the weblog should differ by: 2 hours

Това обаче е вярно само извън периода на лятното часово време (daylight saving time). Всяка година от последната събота на март до последната събота на октомври нашата часова зона всъщност се казва EEST (Eastern European Summer Time) и е с още един час в повече от UTC или +3 часа. Затова след смяната на часовника трябва да впишете 3 в онова поле и след натискане на бутона Update Options страницата с General Options се обновява и следва да показва вярното време в Output полето на Default Time Format.

До тук добре… Дето се вика за това всеки сам се е сетил… И защо тогава, по дяволите вие пишете нещо, което на вашия сайт си е хубаво, красиво и най-важното във вярното време, а на open-culture.net или в някой четец, времето е сбъркано с един, два или три часа според зависи?

Проблемът е че RSS-feed-овете, които вашия блог генерира са всъщност изхода на скрипта wp-rss2.php, който се намира в директорията, в която стоят wordpress-файловете. Ето пример с моите feeds. Ta в този файл има скромна грешчица. Ако го отворите с текстов редактор тя се набива в очи веднага. Говоря за второто срещане на функцията mysql2date в момента, в който тя изписва item-секцията на всеки post. Там има едно поле pubDate, което е точно времето, в което следва да e публикуван post-а ви. Ако погледнете кода, ще видите, че там твърдо е зададено +0000 без значение каква е зоната ви, а времето, което сте вкарали в базата си като параметър на поста ви не е по Гринуич (в общия случай), а е отместено спрямо зоната, затова се получава и глупавото разминаване.

Просто трябва +0000 да се замени с +0300 през лятото и с +0200 като се върнем обратно към нормалното време през есента. Ето така би трябвало да изглежда сега:

Да, знам, че това е супер дървен hack, но нямам амбиции да patch-вам WordPress – това е очеизваден bug и ще бъде оправен със сигурност. Обърнете внимание, че първото извикване на функцията mysql2date, където описва кога е публикуван целия канал, си е съвсем читаво, нищо че е по Гринуич. Това не е проблем за четците и синдикиращите скриптове. Проблем възниква само ако времето е по една зона, а се декларира че тя е друга, което пречи отсрещния скрипт да изчисли читаво времето, защото на практика бива лъган от вашия RSS-генератор.

Йовко Ламбрев

Йовко Ламбрев

ИТ архитект, блогър и (все по-рядко) фотограф. Либерал. Все още вярва, че можем да направим света по-добър.
Пловдив, България