Beiträge vom WordPress Feed ausschließen

Der Query von WordPress läßt sich über verschiedene Wege filtern, in diesem Beitrag möchte ich einen mächtigen Filter aufzeigen und einige Beiträge aus dem Feed entfernen.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 7 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

In einem älteren Beitrag habe ich eine kleine Lösung aufgezeigt, die Kategorien aus dem Feed nimmt. Gleiches kann man natürlich auch mit anderen Inhalten machen und im folgenden ein kleines Beispiel um explizit einige Beiträge aus dem Feed zu nehmen.

Dazu spreche ich den Filter posts_where (wp-includes/query.php) an, der für den Auswertung über den Query gedacht ist und daher gilt es darauf zu achten, dass man auch nur dort filtert, wo es sein soll; in unserem Beispiel im Feed $wp_query->is_feed. Würde man dies nicht tun, so würde beispielsweise auch der Filter im Backend mitlaufen und so fehlen diese Beiträge in der Beitragsübersicht.

Die Funktion hat zwei Parameter und dem ersten Parameter $where wird eine Erweiterung des SQL-Strings übergeben, welches sich um das Filtern an Hand der ID kümmert. Innerhalb der Klammer müssen dann die IDs der Beiträge angegeben werden, so dass sie im Falle des Feed gefiltert werden.


function fb_post_exclude($where, $wp_query = NULL) {
	global $wpdb;
	
	if (!$wp_query)
		global $wp_query;
	
	if ($wp_query->is_feed) {
		// exclude post with id 40 and 9
		$where .= " AND $wpdb->posts.ID NOT IN (40, 9)";
	}
	
	return $where;
}
add_filter( 'posts_where', 'fb_post_exclude', 1, 2 );

Eine alternative Lösung stelle ich im folgenden Code dar. Diese ist wesentlich stabiler und sauberer für diesen Anwendungsfall, da sie nicht auf eine Tabelle im Syntax zugreift, sondern lediglich Funktionen von WordPress nutzt und damit immer funktionieren sollte, auch wenn sich die Tabellen ändern.


function fb_exclude_filter($query) {
    if ( !$query->is_admin && $query->is_feed) {
        $query->set('post__not_in', array(40, 9) ); // id of page or post
    }
    return $query;
}
add_filter( 'pre_get_posts', 'fb_exclude_filter' );

Viel Spaß beim Spielen und Anpassen. Die Funktion ist ja recht klein, zeigt aber schön die Möglichkeiten und kann beliebig erweitert werden. So ist sicher ein Feld im Backend von WordPress denkbar, so dass die Pflege der Beiträge einfacher von der Hand geht.

Kommentare sind geschlossen.