0xDEADBEEF

RSS odkazy english edition
««« »»»

RSS v PHP

14. 6. 2020

RSS není komplikované a není důvod pro to, aby chybělo na jakémkoli webu. Možná ho využije jen pár lidí, ale ti vás za něj budou milovat a co víc - úsilí nutné pro implementaci je tak maličké, že skutečně neexistuje žádná výmluva.

Bohužel, když vyhledáváte návody, jak na RSS v PHP, výsledky jsou archaické a mají k dokonalosti daleko. XML typicky vypisují manuálně bez escapování. Takový program snadno vyprodukuje nevalidní XML, některé čtečky se ho ani nebudou snažit dekódovat a odmítnou je jako nečitelné smetí. Výsledek je potom stejný jako, kdyby web RSS vůbec neměl.

Tento článek je moje snaha tristní stav aspoň trochu napravit. Tady máte jednoduchý skript pro generování minimálního, ale užitečného RSS v nových verzích PHP za pomoci SimpleXML. Vezměte ho, zkopírujte ho, upravte ho, použijte ho, udělejte z něj knihovnu, je to pár řádků a není příliš pravděpodobné, že by bylo nutné provádět zásadní změny, když RSS standard zůstal stabilní posledních 10 let.

class RSS {
  private $rss;

  function __construct(string $title, string $description = '', string $link = '') {
    $this->rss = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><rss version="2.0"/>');
    $this->rss->channel->title = $title;
    $this->rss->channel->description = $description;
    $this->rss->channel->link = $link;
  }

  function addItem(string $title, string $url, string $body, \DateTimeInterface $date): SimpleXMLElement {
    $item = $this->rss->channel->addChild('item');
    $item->title = $title;
    $item->guid = $url;
    $item->guid['isPermaLink'] = 'true';
    $item->description = $body;
    $item->pubDate = $date->format(DATE_RSS);
    return $item;
  }

  function toString(): string {
    return $this->rss->asXML();
  }
}

Kdyby mi nepřišlo trapné lepit na takový plivanec kódu licenci, prohlásil bych to za volné dílo/public domain. Pokud by někdo přece jen chtěl chtěl hotovou věc, skript je součástí RSS everything.


+1: Generátor RSS v BASHi

píše k47 (@kaja47, k47)