WordPress RSS-feeds time fix

Default Featured Image

Днес, след конференцията на 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 като се върнем обратно към нормалното време през есента. Ето така би трябвало да изглежда сега:

< ?php echo mysql2date('D, d M Y H:i:s +0300', get_the_time('Y-m-d H:i:s')); ?>

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

9 коментара

Leave a comment
  • Отделно проблемът с RSS feeds, когато локализираш WordPress, тъй като изкарва името на месеца според самия локал. За целта допълнителен нулев параметър към mysql2date() функцията върши прекрасна работа…

  • Много благодаря за „публичния отговор“ и на мен ще ми бъде полезен (до някъде). Дървено е наистина но е чак толкова, все пак се прави 2 пъти годишно, а не всеки ден :) Ще го прежвееем някак да редактираме 2 пъти годишно един файл. Какви неща правил без да се замисляме, та това ли? :-]

  • Само, че Валери – ти си patch-нал и на двете места функцията и така пак лъжеш горките скриптове ;) Виж pubDate на channel-секцията – времето ти е в Гринуич, а го декларираш като +0300. Това няма значение за open-culture, защото не четем датата на канала, само тази на постовете, но не знам как се отразява като цяло другаде…

  • Точно това си мислех да променя за да видя дали в него не се крие магията, но се случи да те видя преди да пробвам. Още веднъж едно огромно благодаря за изчерпателния отговор! :)

  • При мен с WordPress 1.2.2 и само с настройка в Options си дава правилно време на сайта и на Open-Culture. Сега видях, че всъщност в RSS файла, времето е по Гринуич, но с правилно извадени 3 часа и затови мисля, че твърдо зададения +0000 не е проблем, ако четецът разбира от часови зони ?!?

  • В какъв смисъл времето ми е по Гринуич ? Междудругото, patch-нах wp-rss.php и wp-rss2.php така, че да взима това отместване от настройките, които ти спомена.

    Въпреки това намирам смисъл в това това отместване да е забито твърдо в PHPто: датата на публикацията се взима от MySQL във вида „2005-04-06 14:20:10“, т.е. там се съхранява без това отместването. Предполага се, че това време там съдържа отместването. Това, което трябва да се получи е, че публикациите преди „daylight saving“ трябва да са с отместване +0200, а тези след това – с +0300, а резултат всъщност е, че в RSSите всички излизат с едно и също отместване. Изходът е в базата да се съхранява и отместването.

  • @Bashev: че не може ли да сложим една cron job веднъж на 6 месеца ;) ? Не е много трудно, доколкото ми се вижда?
    Търси +0200 или +0300 и го заменя с другото… веднъж на 6 месеца ;).

  • Хриси, you’re welcome :)

    iko, не помня как е в 1.2.2, но в 1.5 проблемът съществува. Четецът разбира от зони, но не и когато времето e изписано по EEST, а за зона му идва +0000 (демек Гринуич), или обратното – той все пак няма гадателски способности ;)

    Валери, виж си pubDate на channel дефинициите – там имаш:

    Sat, 16 Apr 2005 20:43:39 +0300

    а после за първия item:

    Sat, 16 Apr 2005 23:43:39 +0300

    На първата дефиниция трябва да си стои +0000, защото времето ти е по Гринуич (три часа назад), а не +0300 – вгледай се хубавичко ;)

  • В текущата svn версия на WordPress всички часове във rss feed-а са са по Гринуич. Независимо от настройките на блога.

    Това улеснява работата (и намалява странните часове на публикуване) на агрегаторите, които *не* разбират от часови зони (а такива вярвам има доста). От друга страна, това часовете да са само по Гринуич понякога ограничава *другите* агрегатори, които все пак отделят внимание на часовите разлики. Представете си, че някой иска да разбере дали нещо е пуснато вечерта или рано сутринта? Невъзможно. Просто реалното време на публикуване се губи.

    По тази причина съм съгласен с Валери, че във feed-а часът на всеки постинг трябва да бъде показван в локалната часова зона – тази, в която той е бил публикуван.

    В базата си от данни WP пази за публикациите и коментарите две времена: едното е по Гринуич, а другото е локалното – получено от това по Гринуич и потребителската настройка за разликата. Така ако в един момент решим да сменим настройката (преместим се в друга зона, дойде лято…), то постовете преди промяната няма да се повлияят от нея. За съжаление в момента явно разликата не се пази за всеки пост и ако искаме да си я пресметнем ще се набъркаме в неприятна аритметика/парсване на дати и часове.

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>