Als ich die ersten Tests mit der Blog-Aggregation für den SOOC13 machte, hatte ich mir bereits vorgenommen, die etwas einfallslose lange Liste aus Links zu verbessern, die von WP RSS Aggregator standardmäßig erzeugt wird. Bei der Masse an Quellen, die wir wahrscheinlich aggregieren werden und dem hohen Sichtungsaufwand, der bei der Bewertung der Teilnehmer zu erwarten ist, ist der Bedarf zu Filterung des Nachrichtenstroms durchaus hoch.

Nun könnte man die relevanten Blogs alle per Feedreader einzeln aggregieren. Das setzt aber voraus, dass man sich den Aufwand macht, die Teilnehmer-Blogs einzeln anzusurfen, um an die RSS-Feeds zu kommen. Das geht zwar, Nachteil der Variante ist aber, dass das dann jeder Teilnehmer für sich selbst machen muss. Das ist ziemlich aufwendig und teilen kann man sein Abopaket auch nicht.

Die Idee

Da wir als Veranstalter sowieso eine Liste aller Quellen haben und daraus einen RSS-Feed bauen, kam mir die Idee, diesen einfach als Konfigurator zu umzugestalten. Anja hat diese Idee dann gestern im 2. Chemnitzer-Präsensworkshop auch passend visualisiert:

DSC_0036

In Textform ausgedrückt, heißt das Folgendes: Wir wollen weiterhin im Standard einen vollständigen Nachrichtenstrom anbieten. Wem das zu viel ist, der erhält die Möglichkeit sich seinen eigenen RSS-Feed zusammenzustellen, wobei man diese Zusammenstellung über die URL auch noch teilen kann. (Kleines Beispiel) Ist die Liste gefiltert, wird auch der Link des RSS-Feeds so angepasst, dass man sich seine Zusammenstellung direkt abonnieren kann.

Die Umsetzung

Die einzige Schwierigkeit in der Umsetzung liegt darin, die Datenbank-Abfrage für WordPress zu erstellen und in Plugin-Form zu pressen. Eine Lösung über die WordPress-API (query_posts, get_posts, usw.) ist an der Stelle nicht mehr möglich, weil es einfach zu viel Rechenzeit kosten würde. Nach einigen herumprobieren und informieren, hatte ich sie dann endlich zusammen (Das ist ein Beispiel für die Abfrage von 2 Quellen, bei mehr muss man lediglich die HAVING-Klausel erweitern):

SELECT DISTINCT p.ID, p.post_title, p.post_type, m1.meta_value AS feed_id, m2.meta_value AS description, m3.meta_value AS itemdate, m4.meta_value AS permalink
FROM `$wpdb->posts` p, `$wpdb->postmeta` m1, `$wpdb->postmeta` m2, `$wpdb->postmeta` m3, `$wpdb->postmeta` m4
WHERE p.`post_type` = 'wprss_feed_item' AND p.ID = m1.post_id AND p.ID = m2.post_id AND p.ID = m3.post_id AND p.ID = m4.post_id AND m1.meta_key = 'wprss_feed_id' AND m2.meta_key = 'wprss_item_description' AND m3.meta_key = 'wprss_item_date' AND m4.meta_key = 'wprss_item_permalink'
HAVING (`feed_id` = '460' OR `feed_id` = '468')
ORDER BY itemdate DESC

Durch diese einzige Abfrage, werden die Metadaten aus wp_postmeta so mit der wp_posts Tabelle verknüpft, dass man eine einzige Tabelle erhält, in der alle aggregierten Beiträge enthalten sind. Diese lässt sich mit PHP anschließend ziemlich einfach in die gewünschte Form bringen (und auch auswerten, aber dazu in ein paar Wochen mehr… )

Schließlich muss man nur noch die Oberfläche erstellen und die sieht im fertigen Zustand so aus:

aggregator