
- Bild: Jean von Oertzen
WordPress stellt dem Leser eine Vielzahl an unterschiedlichen Feeds bereit, nähere Erläuterungen wurden bereits im Artikel „Feed-Adressen unter WordPress“ beschrieben.
Da WordPress aber auch des öfteren als Nicht-Weblog-System verwandt wird, kann es sein, dass die Feed-Ausgabe an diesen Stellen nicht ausreicht und man bestimmte Inhalte mischen möchte um den Lesern einen entsprechenden Feed zur Verfügung zu stellen. WordPress ist dahingehend gerüstet und flexibel genug um auch diese Anforderung zu erfüllen. Wie man das macht und wie man es in einem Theme komfortabel per Funkion einbaut, dazu in diesem Artikel einige Worte und Code-Schnipsel.
Der Template Tag query_posts ist sehr mächtig und kann in diesem Fall auch weiter helfen, so ist kein Eingriff in den Core oder eine Erweiterung des Systems nötig.
Um aber das Prinzip ein wenig besser zu verstehen und sich den Zusammenbau eines Feed zu erleichtern, im Vorfeld einige Hinweise und Grundlagen zu Feeds in WordPress.
WordPress bietet die vier Feed-Formate RDF, RSS 0.92, RSS 2.0 und ATOM 1.0 (seit WP V2.*) an. Diese können im Standard auf Beiträge, Kommentare und alle Inhalte eines Archiv erstellt werden - so zum Beispiel Kategorien oder Tags. Einige Beispiele zum Verständnis.
- normaler Feed (Permalinks inaktiv) für RDF:
http://example.de/?feed=rdf
- normaler Feed (Permalinks inaktiv) für RSS:
http://example.de/?feed=rss
- normaler Feed (Permalinks inaktiv) für RSS2:
http://example.de/?feed=rss2
- normaler Feed (Permalinks inaktiv) für Atom:
http://example.de/?feed=atom
- normaler Feed (Permalinks aktiv) für für den Tag examble im Format RSS 2:
http://example.de/?feed=rss2&?tag=examble
- normaler Feed (Permalinks aktiv) für RDF:
http://example.de/feed/rdf
- normaler Feed (Permalinks aktiv) für RSS:
http://example.de/feed/rss
- normaler Feed (Permalinks aktiv) für RSS2:
http://example.de/feed
- normaler Feed (Permalinks aktiv) für Atom:
http://example.de/feed/atom
- normaler Feed (Permalinks aktiv) für für den Tag examble im Format RSS 2:
http://example.de/tag/examble/feed/
Nun soll der Feed auf Basis von Kategorien erstellt werden und das Erstellen eines Feeds, in dem verschiedene Kategorien ausgeschlossen werden, wird ebenso realisiert. Alle Beispiele basieren dabei auf dem Format RSS2. Analog zu den im Vorfeld aufgezeigten Möglichkeiten können auch andere Formate erstellt werden.
- der Feed der Kategorie mit ID 23:
http://example.de/feed?cat=23
- ein Feed aus den Kategorien mit ID 12, 13, 23:
http://example.de/feed?cat=12&cat=13&cat=33
- Filter des Feeds durch Ausschließen der Kategorie mit ID 23:
http://example.de/feed?cat=-23
- Filter des Feeds durch Ausschließen der Kategorien mit ID 12, 13, 23:
http://example.de/feed?cat=-12&cat=-13&cat=-33
Vor allem die zweite Möglichkeit zeigt deutlich auf, dass man Feeds erstellen und die unterschiedlichen Kategorien mischen kann. So kann man, besonders interessant bei Websites mit einem vielschichtigen Angebot an Themen, spezifische Feeds für die unterschiedlichen Zielgruppen erstellen.
Nun ist diese Form zwar recht einfach und schnell erstellt, aber damit steht keine Funktion beriet, die man einfach an verschiedenen Stellen nutzen kann. Aber die Themes in WordPress lassen die Erweiterung via PHP zu uns so kann man sich eine oder mehrere Funktionen erstellen und diese, abgelegt in der functions.php des Themes, nutzen. Auch dazu ein Beispiel.
function fb_cat_exclude($query) {
if ($query->is_feed) {
$query->set('cat','-12,-13,-33');
}
return $query;
}
add_filter('pre_get_posts','fb_cat_exclude');
Das obige Beispiel erstellt eine Funktion, die einen Feed aus allen Bereichen, außer Kategorie mit ID 12, 13 und 33 enthält. Mit Hilfe der Filter-Hooks wird diese Funktion an den den Query übergeben. Damit wird in das Herz von WordPress zum Erstellen der Ausgabe eingegriffen. Mit Hilfe des Conditional Tag is_feed() wird dafür gesorgt, dass das Entfernen der drei Kategorien nur im Feed statt findet.
Damit steht Ihnen ein mächtiges Werkzeug zur Verfügung, der Leser konsumiert die Inhalt, die Sie in den Bereichen erstellen wollen. Ebenso kann man so die Inhalte des Feeds beeinflussen und auf spezielle Anforderungen gestalten.
Ein toller Beitrag, danke! Habe es gerade ausprobiert, funktioniert wunderbar! Gibt es eine Möglichkeit den Feed ohne Dein Plugin mit einem Copyright zu versehen? Ich nutze die Ausgabe der verkürzten Version, somit werden die Vorgaben des Plugin im Feed nicht mit ausgegeben.
@Nicki: Das Plugin kann auch die Ausgabe, wenn es sich um gekürzte Feeds handelt. Dazu musst du lediglich den Haken an der Checkbox "Short Feed" (Also attach on short version of the feed? ... ) setzen. Das kann man auch ohne Plugin machen, dazu muss man aber eine Funktion, quasi das Plugin in das Theme integrieren.
oh da hab ich was übersehen... besten Dank!
Sehr interessant, wusste noch nicht dass man die Feeds so leicht beeinflussen kann - das gibt Ideen für ganz neue Benutzerinteraktionsmöglichkeiten (was für ein Wort...). Danke.
Sehr schön erklärt und leicht nachvollziehbar wenn man sich ein wenig mit der Materie auseinandergesetzt hat. Werde meinen Feed gleich mal umbauen.
Hallo Frank,
sehr hilfreich, Du bist wirklich der WordPress-Profi! Kategorien includieren kannte ich aber excludieren finde ich um Einiges besser..Danke Dir!
Bis dann
Preisfrage
Ich will die Funktion nutzen, sprich aus allen Feed die Kategorie 1234 ausschließen.
Aber für genau diese Kategorie will ich auch den Feed http://example.de/feed?cat=1234 bereit stellen.
Wie löse ich das? Denn die Funktion wird ja dann quasi global?
Funktioniert sowas in dem Fall:
if ($query->is_feed && !is_category('1234') {
@MArc: in dem du einen neuen Feed erstellst, die die untere Beispielfunktion. Du bietest quasi einen Feed ohne cat 1234 und einen Feed nur 1234 an. Im header verlinkst du beide Feeds und damit können dann auch diverse Browser beide Feeds aggregieren.
Hm ja... Aber momentan haben ja schon einige den "/feed/" abonniert, von daher würde ich ihn schon gerne mittels $query beschränken und gleichzeitig einen Feed haben, der genau diese ausgeschlossene Kategorie anbietet.
Ich nehme an, meine oben genannte Code-Idee würde nicht funktionieren?
den bestehenden Feed kürzt du, in dem du die Kategorie entfernst und deine einzelne Kategorie gibst du für einen neuen Feed frei. Damit bleiben deine Abonnenten erhalten.
Ich setze das Plugin extra-feed-links ein. Damit hat man schnell Feeds für Kategorien oder Tags. Danke für den Code, eine beliebige Kategorie wird nun ausgeschlossen. Ist es möglich, auf der Frontpage z.B. http://www.testseite/feed eine Kategorie auszuschließen, die aber bei http://www.testseite/tag/quatsch/feed wieder zuzulassen? Ich habe eine Kategorie ausgeschlossen, nie nicht so ins Schema meiner Seite passt, die soll auf der Frontpage nicht erscheinen, als Tag-Feed aber schon.
Wolf
@Wolf: zum Verständnis, WordPress bietet immer zum Tag oder Kategorie einen Feed an, ohne Plugin. Die Feeds sind immer da, es sei denn man schaltet sie via Filter explizit ab. Ansonsten ist das Listen von Feeds im head des Blog eine Sache des Frontend, die im Theme eingebaut ist.
Hallo,
super erklärt.
Aber eine Frage hätte ich noch.
Wenn man mehrere Autoren in einem Blog hat, gibt es da die Möglichkeit Artikel von verschiedenen Benutzern aus dem Feed auszuschliessen?
Gruß
Christi
@Christian: da sollte es ein Plugin geben, da man ja jedem Beitrag ein Flag mitgeben muss. Ich bin aber der Meinung, dass ich sowas schonmal gesehen habe.
Hallo,
kann es sein, dass das Skript in Zusammenarbeit mit dem feedburner nicht funktioniert?
Gruß
Christian
na ja es geht auch anders mit dem feedburner. Wenn man bei den Einstellungen des feedburners als Original-Feed Adresse http://example.de/feed?cat=-23 übergibt, schluckt es auch der feedburner.
Gruß
Christian
Frank, ich würde nach einer Lösung suchen, einzelne Artikel aus dem Feed auszuschließen. Könnte das auf einem solchen ähnlichen Weg funktionieren?
@Crazy Girl: ja, in dem Beispielcode sind es ja bestimmte Kategorien, aber das kann natürlich auch alles andere sein.
Gehe ich dann richtig in der Annahme, dass es bei Artikeln so aussehen müsste?
$query->set('p','-12,-13,-33');, also stat 'cat' einfach 'p'?@Crazy Gilr: nein, das wird nix. Um es sauber zu machen, würde ich über den posts_where filter gehen; ein Beispiel:
Eventuell macheich mache einen kleinen Post daraus, wenn es dazu nix gibt.Gibt es eine Möglichkeit das Aussehen der Links im Feed zu bearbeiten/anzupassen? Konkret schwebt mir so etwas vor, wie es bei Viper's Video Quicktags gehandhabt wird. Ist ein Video eingebettet, das im Feedreader nicht angezeigt werden kann, erscheint ein Link mit dem Hinweis "Hier klicken um das Video auf der Originalseite anzuschauen" oder so ähnlich.
@Matthias: es ist ein feed, ein XML Dokument und entspricht einem Format, welches keine Eigenschaften in der Optik nötig hat, da dies der Reader oder das importierende Tool übernimmt.
Ja das mit der Optik ist klar, blöderweise habe mich mit "Aussehen bearbeiten" sehr missverständlich ausgedrückt.
Ich meinte eigentlich, ob man irgendwo festlegen kann, dass alle Textlinks umgeschrieben werden sollen!? Wenn das irgendwie für Videoobjekte geht, dann müsste es ja eigentlich auch für Links gehen, oder kommt das dann wieder darauf an, wie die jeweiligen Verweise/Objekte (Links, Videos) in den eigentlichen Blogbeitrag eingebettet sind?
@matthias: ginge schon, aber was willst du aus den Links machen, die sind einfach im content und das Element a ist dort korrekt und muss nicht via enclosure implementiert werden, was bei Video oder anderen Medien dieser Art Sinn macht.
@Frank: z.B. Links einer bestimmten Klasse im Feed eine Bildchen mitgeben (z.B. Werbungskennzeichnung). Über das Feedstyler Plugin mit entsprechender CSS geht das nicht, da Feeds ja kleine background-images nehmen. Pseudo Klasse content fällt im Falle Feed ja auch aus. Würde so was vielleicht via spezielle Links umschreiben gehen?
@Crazy Girl: du kannst schon das Bild mitgeben, dazu musst du aber den img-Tag implementieren, da CSS im Feed fehl am Platz ist; heißt aus dem a-Tag wird img a, so dass das Bild vor dem Link ist. Dies kann man erreichen, wenn man den Filter the_content anspricht und das Bild nur einlagert, wenn es sich um den Feed handelt. Die Frage ist, ist dies wirklich sinnvoll, wobei mir dein Bsp. einleuchtet.
Hallo Frank,
ich würde gern per Eintrag in die functions.php die Kategorie 16 aus allen Formen und Erscheinungsweisen von Feeds ausschließen.
Wie kann ich Nicht-PHPler das denn das machen? Ich kürze einfach die if-Abfrage raus, also ungefähr so?
function fb_cat_exclude($query) {$query->set('cat','-12,-13,-33';
}
return $query;
}
add_filter('pre_get_posts','fb_cat_exclude');
Danke!
Nein - das war natürlich noch ein bisschen schräg.
Also eher so?
function fb_cat_exclude($query) {$query->set('cat','-16';
return $query;
}
add_filter('pre_get_posts','fb_cat_exclude');
PS.: Für so Leute wie mich, die sich an ihre Sache erst herantasten müssen, wäre eine Editierfunktion für die eigenen Kommentare klasse.
Grüße! Stefan
@Stefan: dazu muss nur eine Abfrage rein, ob es sich um den Feed handelt.
Hättest Du mal ein Beispiel für mich, wie ich so eine spezielle a class mit einem entsprechenden img im Feed versehe? Würde es gerne mal ausprobieren
toll, das hilft! Danke dir!!
hallo frank, die von dir beschriebene lösung kategorien aus dem feed auszuschliessen hat bisher tadellos funktioniert. eben habe ich allerdings - zum ersten mal seit dezember - in der ausgeschlossenen kategorie gepostet und hatte den beitrag prompt im feed.
hat sich da durch 3.1 irgendwas geändert?
@nico: nicht dass ich wüsste, da es sich hier um eine Default Möglichkeit handelt, die damit klappen sollte.
Hallo Frank, nutze eine ähnliche Lösung schon länger, jetzt habe ich den Fall das ich für eine ausgeschlossene Kategorie einen seperaten Feed benötige. Die Lösung domain.de/feed?cat=33 funktioniert natürlich nicht da auch hier die Artikel von der functions.php ausgeschlossen werden.
Hast du ne Idee / einen Ansatz wie ich trotzdem an einen Feed für diese Kategorie komme?
@Heiko: jedes Archiv, also auch jede Kategorie haben einen Feed im Standard, du musst ihn nur abgreifen; wenn Permalinks aktiv sind, dann einfach /feed/ an die URL der Kategorie hängen.
@Frank: Das war auch meine erste Idee! Aber der Feed für die entsprechende Kategorie enthält keine Artikel. Technisch auch logisch da der Filter in der functions.php diese ja entfernt.
Meine nächste Idee war eine Bedingung, dass wenn explizit der Kategorie-Feed abgerufen wird, der Filter nicht ausgeführt wird. Meinst du in der Richtung könnte man was basteln, oder hast du eine andere Idee?
@Heiko: ah so, du schaltest quasi die Feeds ab, dann mach eine Ausnahme für die Kategorie rein und schon hat sie wieder ihren Standard-Feed, schaue dich bei dem letzteren Filter dieses Beitrags um
Hallo Frank,
dank deiner Anleitung konnte ich nun zwei verschiedene Feeds anbieten - prima Sache. Jetzt würde ich gern noch statische Seiten einschließen: In meinem Photovoltaiklexikon schreibe ich immer wieder statische Beiträge, die ich zugleich unter die Feed-Nachrichten mische. Mit dem Plugin RSS Includes Pages geht das - aber wenn ich einzelne, besondere Seiten nun in meinen zweiten Feed mischen will - da stoße ich als Nicht-PHPler an meine Grenzen. Hast du vielleicht eine Idee?
Danke dir!!
@Stefan: dazu musst du eh weiter erweitern, da du ja ein Flag an den ausgewählten Seiten mitgeben musst, so dass sie in den Feed kommen.
ich würde vermutlich eher einen Beitrag schreiben und auf den Inhalt der Page hinweisen, damit erziehlst du mehr Leser und dafür sind Posts ja auch da. Pages sind eben statischer natur und wenig für den Feed geeignet.
Danke dir für die rasche Antwort; und - tja, schade ... einerseits hast du natürlich Recht. Aber andererseits sollte die reine Lehre ja nur eine Stütze sein, kein Korsett ...
Ich gucke mal, ob ich eine Lösung finde. Wahrscheinlich über benutzerdefinierte Felder oder so. Mal sehen. Jedenfalls, danke dir erstmal!
Ich suche eine Möglichkeit alle passwort-geschützten Artikel aus dem Feed auszuschließen. Leider hat Google dazu keine Antworten, hat hier vielleicht jemand eine Idee?
@Heiko: du kannst diese Artikel filtern, dazu über den Hook
pre_get_postsgehen, wie in diesem Beispiel.@Frank: Ahh,
pre_get_posts. Danke, dass hatte ich gesucht. Seltsam das ich das nicht über die Google-Suche gefunden habe.Hab es vorerst darüber gelöst, dass passwort-geschütze Artikel in eine eigene Kategorie kamen und ich die Kategorie ausgeschlossen habe, aber über den Weg über eine eigene Funktion wäre es deutlich eleganter.
DANKE