Feed Cache von WordPress

WordPress bietet schon lange die Möglichkeit über eigene Funktionen Feeds auszulesen und im Blog zu verwenden. Dabei kommt seit Version 2.8 von WordPress eine neue Funktion zum Einsatz. Es gibt also zwei Möglichkeiten mit Feeds in WordPress zu arbeiten und in beiden Funktionen werden die Daten gecacht. Nicht immer ist das gewollt und daher zeige ich mal auf, wie man auf die unterschiedlichen Cache-Varianten den beiden Funktionen einwirkt.

WordPress bietet schon lange die Möglichkeit über eigene Funktionen Feeds auszulesen und im Blog zu verwenden. Dabei kommt seit Version 2.8 von WordPress eine neue Funktion zum Einsatz. Es gibt also zwei Möglichkeiten mit Feeds in WordPress zu arbeiten und in beiden Funktionen werden die Daten gecacht. Nicht immer ist das gewollt und daher zeige ich mal auf, wie man auf die unterschiedlichen Cache-Varianten den beiden Funktionen einwirkt.

fetch_feed() Seit WordPress 2.8

Mit Version 2.8 von WordPress wurde die Klasse SimplePie in den Core geholt. SimplePie hat sich immer durch eine sehr schnelle Entwicklung und eine stabile nutzerfreundliche Klasse ausgezeichnet. Im Vorfeld wurde MagpieRSS eingesetzt, was in vielen fällen nicht nutzbar war und die Entwicklung ist recht langsam. Seite geraumer Zeit wird auch SimplePie nicht mehr durch die Entwickler betreut, was zuerst für eine gewissen Unruhe in den Entwicklerkreisen sorgte; Entwickler aus dem WordPress-Team kümmern sich aber um die Klasse und sorgen für ihr bestehen. Mehr dazu gibt es meinem Artikel SimplePie Entwicklung gestoppt

Nun ist die Klasse aber im Core von WordPress und eignet sich ebenso für RSS- und ATOM-Feeds. Sie nutzt den Cache von WordPress und der kann via Hook angesteuert werden.

Zuerst aber ein kleines Beispiel um einen Feed mit der Klasse in WordPress auszulesen.


<?php
include_once(ABSPATH . WPINC . '/feed.php');
$rss = fetch_feed('https://bueltge.de/feed/');
$rss_items = $rss->get_items( 0, $rss->get_item_quantity(5) );
if ( !$rss_items ) {
	echo 'no items';
} else {
	foreach ( $rss_items as $item ) {
		echo '<p><a href="' . $item->get_permalink() . '">' . $item->get_title() . '</a></p>';
	}
}
?>

Das kleine Beispiel liest meinen Feed aus und gibt die letzten 5 Einträge zurück.

Kern ist die Funktion fetch_feed(). Diese Funktion besitzt einen Hook, durch den man auf das Caching Einfluss nehmen kann - wp_feed_cache_transient_lifetime.
Im Standard ist der Cache auf 12 Stunden (43200) eingestellt, was nicht immer im Sinne der Nutzer ist. Der Wert wird über die Methaode WP_Feed_Cache_Transient() bedient, Parameter $lifetime. Daher ist es ratsam, den folgenden kleinen Aufruf zu nutzen, sei es im Plugin oder in der functions.php des Themes.


add_filter( 'wp_feed_cache_transient_lifetime', create_function( '$a', 'return 1800;' ) );

In diesem Beispiel habe ich den Cache auf 30 Minuten gesetzt. Mit Hilfe der Conditional Tags kann man das ganze dann so steuern, dass der Cache-Hook nur angesteuert wird, wenn man auf einer Seite (is_page()) oder bspw. im Frontend (!is_admin()) des Blog ist. Hier muss man einfach die Möglichkeiten nutzen und an die eigenen Bedürfnisse anpassen.

Eine kleine Möglichkeit möchte ich aber noch aufzeigen, verfügbar ab WordPress 2.9 (Ticket 11117), um das Debuggen für Entwickler zu vereinfachen. Damit wird der Cache in der Umgebung deaktiviert, wenn die Konstante WP_DEBUG gesetzt ist, was ab und dann wichtig sein kann. Das Setzen der Konstante geschieht in der Regel in der wp-config.php der Installation, alternativ natürlich auch im Plugin.


function do_not_cache_feeds(&$feed) {
	$feed->enable_cache(false);
}

if ( defined('WP_DEBUG') && WP_DEBUG )
	add_action( 'wp_feed_options', 'do_not_cache_feeds' );

fetch_rss()

Eine weitere Funktion ist fetch_rss(), die mit WordPress 2.8 auf die Abkündigungsliste gesetzt wurde. Als Alternative ist die oben genannte Funktion aktiv. Aktuell ist fetch_rss() aber noch verfügbar und wird auch unterstützt. Daher zur Vollständigkeit, auch hier die Möglichkeit den Cache zu beeinflussen.

Aber auch dazu zuvor ein Beispiel um den Feed auszulesen und die letzten 5 Einträge des Feed auszugeben.


<?php
include_once(ABSPATH . WPINC . '/rss.php');
$rss = fetch_rss('https://bueltge.de/feed/');
$rss_items = array_slice($rss->items, 0, 5);
if ( empty($rss_items) ) {
	echo 'no items';
} else {
	foreach ( $rss_items as $item ) {
		echo '<p><a href="' . $item['link'] . '">' . $item['title'] . '</a></p>';
	}
}
?>

Hier wird die Funktion fetch_rss() zum Auslesen genutzt und der Cache kann via Konstanten verändert werden. Diese muss man entweder direkt in der wp-config.php definieren, wo sie dann global für alle Anwendungen gelten, oder man muss sie in seine eigenen Funktionen integrieren.


define('MAGPIE_CACHE_ON', 0); // deaktiviert den Cache
define('MAGPIE_CACHE_AGE', 60*60) // Cache 1 Stunde in Sekunden

Fazit

Da man sich bei WordPress entschieden hat, MagpieRSS in der Zukunft nicht mehr zu unterstützen, sollte man sich bei neuen Aufgaben immer mit SimplePie auseinandersetzen und die zweite Möglichkeit nicht in Betracht ziehen. Insofern muss man auch nicht die vielen anderen Konstanten von MagpieRSS in WP kennen.

Kommentare sind geschlossen.