Related Posts in einem FSE-Projekt mit Abfrage-Loop und Filter

a close up of a bunch of glass cubes
Foto von ryan plomp auf unsplash

Grundsätzlich bin ich kein großer Fan, ganze Blockfarmen oder Jetpack (erfordert die Verbindung zu einem WordPress.com-Account) zu installieren, nur um an eine bestimmte Funktionalität heranzukommen. Daher beschränkt sich meine Suche zumeist auf ein Plugin mit dem einen Block, der genau die Funktionalität liefert, die gesucht ist.

Die „Klassiker“ in Bezug auf related Posts sind „Yarpp“ – Yet Another Related Posts Plugin und Contextual Related Posts. Ich stellte mir allerdings etwas jüngeres vor, das explizit für die neue Generation WordPress entwickelt wurde.

Shortcodes in Tempates und Patterns werden nicht ausgeführt. Andererseits ist das mit den beiden Plugins gar nicht erforderlich, da sie automatisch für die Anzeige ähnlicher Beiträge am Ende eines Artikels sorgen. Das machen sie auch in FSE Projekten, sodass es gar nicht erforderlich ist, einen Shortcode zu verwenden.

Für kurze Zeit hatte ich „Yarpp“ installiert. Ohne eigenes CSS wäre die Darstellung allerdings nicht akzeptabel gewesen (auf Contextual Related Posts trifft das ebenfalls zu, das Originaldesign erkennt man sofort am nicht gerade zeitgemäßen Layout). Zudem fand ich es immer mal wieder in Listen vulnerabler Plugins in Sicherheitsreports.

Schließlich beschloss ich, auf ein Plugin zu verzichten und zu prüfen, wie weit sich der Abfrage-Loop Block anpassen lässt. Denkbar wäre hier sicherlich auch, eine Block-Variation für Related Posts zu entwickeln. Wer allerdings nach wie vor lieber mit PHP arbeitet, kann sich hier auch eines Filters bedienen.

In Block Themes gibt es zwar keine PHP-Templates mehr. Erlaubt ist hingegen immer noch eine functions.php. Eine ganz einfache Lösung für related Posts kann sein, den Abfrage-Query-Block im Beitragstemplate einzufügen. Die maximale Seitenanzahl kann hierbei auf 1 beschränkt werden.

grafik 1

In der functions.php (oder über ein Code Snippets-Plugin) lassen sich die Query-Parameter mit Hilfe des query_loop_block_query_vars Filters beliebig modifzieren. Wichtig ist hierbei, gleich zu anfang festzustellen, dass man sich auf einer Beitragsseite befindet. Ansonsten soll der Abfrage-Loop (der auf der Blogstartseite, in Archiven etc. zum Einsatz kommt) nicht modifziert werden.

add_filter( 'query_loop_block_query_vars', 'related_posts_filter_query' );
function related_posts_filter_query( $query ) {
    if ( !is_singular('post') ) return $query;
    global $post;
    $taxonomies = get_object_taxonomies( $post, 'names' );

    if ( $taxonomies ) {
	foreach ( $taxonomies as $taxonomy ) {
		$terms = get_the_terms( $post->ID, $taxonomy );
		if ( empty( $terms ) ) {
			continue;
		}
		$term_list  = wp_list_pluck( $terms, 'slug' );
		$query['tax_query'][] = array(
			'taxonomy' => $taxonomy,
			'field'    => 'slug',
			'terms'    => $term_list
		);
	}	
    }
	
    if ( count( $query['tax_query'] ) > 1 ) {
	$query['tax_query']['relation'] = 'OR';
    }
	
    $query['orderby'] = 'rand';
    $query['post__not_in'] = [$post->ID];

    return $query;
}

Bitte Kommentarfunktion nicht für Supportanfragen nutzen. Dem kann hier nicht entsprochen werden. Die Angabe einer E-Mail-Adresse und eines Namens ist nicht erforderlich. Einen (Spitz)-Namen zu nennen wäre aber doch nett.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Sowohl angegebener Name als auch E-Mail-Adresse (beides ist optional, dafür werden alle Kommentare vor Veröffentlichung geprüft) werden dauerhaft gespeichert. Du kannst jeder Zeit die Löschung Deiner Daten oder / und Kommentare einfordern, direkt über dieses Formular (wird nicht veröffentlicht, und im Anschluss gelöscht), und ich werde das umgehend erledigen. – Mit hinterlassenen Kommentaren hinterlegte IP-Adressen werden nach zwei Monaten automatisch gelöscht

publicly queryable