Ein Kunde sucht nicht nach „Sofas“, sondern nach „graue Samtsofas“. Ihr Shop hat diese Seite
längst: die Kategorie Sofas, mit dem Farbfilter auf Grau und dem Materialfilter auf Samt. Für
Google ist sie aber nur eine von tausenden Filteradressen wie
/produktkategorie/sofas/?filter_farbe=grau&filter_material=samt. Sie trägt die Überschrift
und den Text der Kategorie, und die meisten SEO-Plugins setzen ein Canonical zurück auf die
ungefilterte Kategorie. Ranken kann sie so nicht.
Gleichzeitig erzeugt jeder Filter neue Adressen: jede Farbe mit jedem Material, jede
Reihenfolge, mit und ohne query_type. Dieser Artikel zeigt, was Google zu solchen
Filterseiten (der „facettierten Navigation“) sagt, wie Sie einzelne Kombinationen zu echten
Landingpages machen, mit ein paar Zeilen Code oder mit einem Plugin, und wie Sie den Rest von
den Crawlern fernhalten.
Was Google zu Filterseiten sagt
Google beschreibt Filterseiten in einem eigenen Leitfaden, auf Englisch unter „faceted navigation“. Die Kernaussage: Filter auf Basis von URL-Parametern können „unendliche URL-Räume“ erzeugen, und das schadet auf zwei Arten, durch Übercrawling und durch langsameres Entdecken neuer Inhalte (Google: Managing crawling of faceted navigation URLs). In einem Blogbeitrag von Dezember 2024 nennt Google die facettierte Navigation „bei Weitem die häufigste Ursache für Übercrawling, die Websitebetreiber uns melden“ (Crawling December: Faceted navigation).
Google nennt zwei Wege:
- Filteradressen sperren, wenn sie nicht in den Index sollen. Der erste Weg dafür ist die robots.txt.
- Filteradressen gezielt optimieren, wenn sie gefunden werden sollen.
Beides lässt sich kombinieren: alle Filteradressen sperren, bis auf die wenigen, die Kunden wirklich suchen. Googles eigenes Beispiel sieht genau so aus:
user-agent: Googlebot
disallow: /*?*products=
disallow: /*?*color=
disallow: /*?*size=
allow: /*?products=all$
Das $ am Ende bedeutet „hier endet die Adresse“. Bei mehreren passenden Regeln gilt die
spezifischste, gemessen an der Länge des Pfads; bei gleicher Länge die weniger
einschränkende (robots.txt-Spezifikation).
Eine Allow-Zeile mit der vollständigen Adresse einer Landingpage schlägt also das
allgemeine Disallow, und nur für genau diese Adresse.
Zwei Grenzen sollten Sie kennen. Die robots.txt verhindert das Crawlen, nicht die Indexierung: Google kann gesperrte Adressen trotzdem ohne Inhalt in den Index aufnehmen, und die robots.txt ist kein Werkzeug für Canonicals (Google: Kanonisierung). Und für die Seiten, die in den Index sollen, empfiehlt Google ein Canonical auf die Seite selbst.
Was eine Filter-Landingpage braucht
- eine eigene H1 und ein eigener Text, damit die Seite mehr ist als die Kategorie mit weniger Produkten
- ein eigener Titel und eine eigene Meta-Beschreibung
- ein Canonical auf sich selbst und
index, follow - genau eine Adressform: Der Filter-Block von WooCommerce schreibt
?filter_farbe=grau&query_type_farbe=or, das klassische Widget?filter_farbe=grau, und bei zwei Werten ist die Reihenfolge beliebig. Canonical, interne Links und dieAllow-Zeile müssen alle dieselbe Form verwenden. - interne Links, etwa von der ungefilterten Kategorie, damit Suchmaschinen die Seite finden, auch wenn die Filterlinks gesperrt sind
- genug Produkte: Eine Kombination mit zwei Produkten ist meist zu dünn für eine eigene Seite.
Ein Punkt betrifft nur Shops mit dem Block „Produktfilter“: Er tauscht standardmäßig nur die Produktliste aus, ohne die Seite neu zu laden. Ein Kunde, der auf „Grau“ klickt, sieht dann weiterhin die Überschrift der Kategorie. WooCommerce hat dafür im umgebenden Block der Produktliste (Product Collection) die Einstellung „Reload full page“; dann lädt jeder Filterklick die ganze Seite neu (WooCommerce-Dokumentation).
Weg 1: ein paar Zeilen Code
Für eine Handvoll Seiten in einem klassischen Theme mit Yoast SEO reicht Code in einem
eigenen kleinen Plugin oder in der functions.php eines Child-Themes. Er erkennt die
Kombination in jeder Reihenfolge und mit oder ohne query_type, lässt Preis- und
Sortierfilter in Ruhe und setzt Überschrift, Text, Titel, Beschreibung, Canonical und
index, follow:
<?php
/**
* Filterkombinationen als Landingpages, ohne Plugin: klassisches Theme, WooCommerce-Filter,
* Yoast SEO. In ein eigenes Plugin oder die functions.php eines Child-Themes.
*/
function meinshop_landingpages() {
return array(
// Kategorie-Slug | Filter, alphabetisch, Werte durch Komma getrennt.
'sofas|farbe=grau' => array(
'h1' => 'Graue Sofas',
'titel' => 'Graue Sofas in Samt, Leinen und Wolle',
'beschreibung' => 'Graue Sofas in Samt, Leinen und Wolle, vom Zweisitzer bis zum Ecksofa.',
'text' => '<p>Grau passt zu fast jedem Boden und jeder Wandfarbe.</p>',
),
);
}
/**
* Die Landingpage der aktuellen Seite, oder null.
*/
function meinshop_landingpage() {
static $seite = false;
if ( false !== $seite ) {
return $seite;
}
$seite = null;
if ( ! is_product_category() || is_paged() ) {
return $seite;
}
$filter = array();
foreach ( $_GET as $name => $wert ) { // phpcs:ignore WordPress.Security.NonceVerification
if ( 0 === strpos( $name, 'filter_' ) && is_string( $wert ) ) {
$werte = array_unique( array_map( 'sanitize_title', explode( ',', wp_unslash( $wert ) ) ) );
sort( $werte );
$filter[ substr( $name, 7 ) ] = implode( ',', $werte );
} elseif ( 0 !== strpos( $name, 'query_type_' ) ) {
return $seite; // Preis, Sortierung, Suche …: keine Landingpage.
}
}
if ( ! $filter ) {
return $seite;
}
ksort( $filter );
$paare = array();
foreach ( $filter as $attribut => $werte ) {
$paare[] = $attribut . '=' . $werte;
}
$kategorie = get_queried_object();
$alle = meinshop_landingpages();
$schluessel = $kategorie->slug . '|' . implode( '&', $paare );
if ( isset( $alle[ $schluessel ] ) ) {
$seite = $alle[ $schluessel ];
$seite['url'] = get_term_link( $kategorie ) . '?filter_' . implode( '&filter_', $paare );
}
return $seite;
}
// Überschrift, Kategoriebeschreibung, eigener Text.
add_filter( 'woocommerce_page_title', function ( $titel ) {
$seite = meinshop_landingpage();
return $seite ? $seite['h1'] : $titel;
} );
add_filter( 'woocommerce_taxonomy_archive_description_raw', function ( $text ) {
return meinshop_landingpage() ? '' : $text;
} );
add_action( 'woocommerce_archive_description', function () {
$seite = meinshop_landingpage();
if ( $seite ) {
echo '<div class="term-description">' . wp_kses_post( $seite['text'] ) . '</div>';
}
}, 20 );
// Yoast SEO: Canonical auf die Seite selbst, Titel, Beschreibung, index, follow.
add_filter( 'wpseo_canonical', function ( $url ) {
$seite = meinshop_landingpage();
return $seite ? $seite['url'] : $url;
}, 999 );
add_filter( 'wpseo_opengraph_url', function ( $url ) {
$seite = meinshop_landingpage();
return $seite ? $seite['url'] : $url;
}, 999 );
foreach ( array( 'wpseo_title', 'wpseo_opengraph_title' ) as $meinshop_hook ) {
add_filter( $meinshop_hook, function ( $titel ) {
$seite = meinshop_landingpage();
return $seite ? $seite['titel'] : $titel;
}, 999 );
}
foreach ( array( 'wpseo_metadesc', 'wpseo_opengraph_desc' ) as $meinshop_hook ) {
add_filter( $meinshop_hook, function ( $text ) {
$seite = meinshop_landingpage();
return $seite ? $seite['beschreibung'] : $text;
}, 999 );
}
add_filter( 'wpseo_robots_array', function ( $robots ) {
if ( meinshop_landingpage() ) {
$robots['index'] = 'index';
$robots['follow'] = 'follow';
}
return $robots;
}, 999 );
Getestet am 20.10.2026 mit WordPress 7.1.3, WooCommerce 11.2.1, Storefront und Yoast SEO 28.7. Was der Code nicht tut:
- Block-Themes wie Twenty Twenty-Five zeigen die Überschrift über einen Titel-Block des
Archivs; dort brauchen Sie zusätzlich den Filter
get_the_archive_titleund für die Kategoriebeschreibungrender_block_core/term-description. - Rank Math hat eigene Filter (
rank_math/frontend/canonicalund andere). - Die robots.txt schreiben Sie selbst: ein
Disallowfür/*?filter_,/*&filter_,/*?query_type_und/*&query_type_, und pro Landingpage einAllow: /produktkategorie/sofas/?filter_farbe=grau$. - Interne Links und das Leeren des Caches nach einer Änderung auch.
Für drei Seiten ist das überschaubar. Bei zwanzig Seiten, mehreren Kategorien und einem Redakteur, der Texte ohne PHP pflegen will, wird es mühsam.
Weg 2: Plugins, die Sie vielleicht schon haben
Prüfen Sie zuerst, was Ihr Filter-Plugin kann. Stand 20.10.2026:
- Filter Everything ist ein eigenes Filter-Plugin. Eigene H1 und Meta-Tags für Filterseiten („SEO Rules“) gibt es nur in der PRO-Version, ab 69 $ pro Jahr (filtereverything.pro). Die Dokumentation beschreibt nicht, wie Canonical und robots.txt behandelt werden.
- SEO Product Filter von Premmerce auf WooCommerce.com kostet 79 $ pro Jahr und
dokumentiert ein Canonical auf die Regelseite selbst und
Disallow-Zeilen für ausgeschlossene Seiten (WooCommerce.com). Im kostenlosen Premmerce-Plugin auf WordPress.org sind Landingpages eine Premium-Funktion. - HUSKY hat sprechende Filteradressen schon kostenlos, aber nur für zwei Regeln; unbegrenzt in der Premium-Version, ab 49 $ pro Jahr (products-filter.com).
- Wenn Sie Filterseiten nur sperren wollen, ohne eigene Landingpages: FacetFence Product
Filters (kostenlos, für die Adressen der WooCommerce-Filter) oder Smart Filter Noindex auf
WooCommerce.com (29 $) setzen
noindexauf Filteradressen.
Wer bereits eines dieser Werkzeuge nutzt und damit zufrieden ist, braucht kein weiteres.
Weg 3: unser kostenloses Plugin
Wir haben Opuswerk Filter Landing Pages for WooCommerce für Shops gebaut, die die Filter von WooCommerce selbst verwenden, das Widget „Produkte nach Attribut filtern“ oder den Block „Produktfilter“, und die nicht das Filter-Plugin wechseln wollen. Es macht aus den Kombinationen, die Sie auswählen, Landingpages unter der Adresse, die der Filter ohnehin erzeugt:
- Sie öffnen die gefilterte Kategorie im Shop und klicken in der Werkzeugleiste auf „Als Landingpage anlegen“.
- Überschrift, Einleitungstext, Text unter den Produkten, Titel und Beschreibung pflegen Sie im Editor, ohne Code.
- Canonical und
index, followgehen über Yoast SEO oder Rank Math; ohne SEO-Plugin gibt das Plugin sie selbst aus. Ist ein anderes SEO-Plugin aktiv, lässt es den Seitenkopf in Ruhe. - Jede Adressform wird erkannt und in einer einzigen Form gespeichert, die Canonical, Links und robots.txt gemeinsam verwenden.
- Es zeigt den robots.txt-Block zum Kopieren, mit einer
Allow-Zeile pro Landingpage. - Auf der ungefilterten Kategorie erscheinen Links „Beliebte Filter“ zu den Landingpages.
- Der Block „Produktfilter“ lädt in Kategorien mit Landingpages die Seite neu, sonst nicht.
Was es nicht tut: Filteradressen, die keine Landingpages sind, bleiben unverändert, es schreibt weder die robots.txt noch eine Sitemap, und Landingpages gibt es nur auf Produktkategorien. Es sendet keine Daten und braucht kein Konto. Eine deutsche Übersetzung in der Sie- und der Du-Form ist fertig; WordPress lädt sie, sobald sie auf translate.wordpress.org freigegeben ist.
Kurz-Checkliste
- die zehn, zwanzig Kombinationen auswählen, nach denen Kunden wirklich suchen
- jede mit eigener H1, eigenem Text, Titel und Beschreibung
- Canonical auf die Seite selbst, in einer einzigen Adressform
- Links von der Kategorie auf die Landingpages
- in der robots.txt alle Filteradressen sperren, die Landingpages mit
Allowund$freigeben - nach dem Speichern den Cache leeren und die Seite in der Search Console prüfen
opuswerk entwickelt kleine WordPress-Plugins für WooCommerce-Shops, jedes für genau eine Aufgabe.