Seiten aus WordPress Suchergebnissen ausschließen / Exclude Pages from WordPress Search Results

23. November 2012 | Ca. 6 Minuten Lesedauer

Aus verschiedensten Gründen könnte man wollen, dass in der WordPress-internen Suchfunktion statische Seiten ausgeschlossen werden. Dazu stolpert man im Internet ziemlich häufig über einen kleinen Codeschnipsel, den man in die functions.php einbauen soll. Der tut auch was er soll, deaktiviert aber damit auch die Suchfunktion in der Mediathek. Mit einer kleinen Anpassung, kann man das allerdings ändern.

There might be several reasons why you want WordPress to not display static pages in its search results. Quite easily you can find a little piece of code to take care of excluding static pages by just putting this code in your functions.php. Actually the code does what it is supposed to do, but he also deactivates the search function in the media library. With a little change you can fix this.

Was man vermutlich findet ist dieser Code, der in die functions.php des jeweiligen Themes kopiert werden muss:

What you will probably find is this piece of code which shall be copied into the functions.php of your theme:

// Remove static pages from search results
function excludePagesfromSearch($query) {
if ($query->is_search) {
$query->set('post_type', 'post');
}
return $query;
}

add_filter('pre_get_posts','excludePagesfromSearch');

Dieser Code erstellt einen Hook (add_filter) und sorgt dafür, dass nur Elemente zurückgeliefert werden, die vom Typ (post_type) „post“ (Blogeintrag) sind. Das stellt ein Problem dar, weil WordPress intern die gleiche Suche nutzt, um die Mediathek zu durchsuchen. Bilder bzw. Anhänge allgemein sind in WordPress allerdings mit dem post_type „attachment“ gespeichert. Damit werden Sie dann von der Suchfunktion ebenfalls ignoriert und die Suchergebnisse sind immer leer. Dies lässt sich beheben, indem man folgenden Code nutzt:

This code creates a hook (add_filter) and takes care, that only elements are returned whose type (post_type) is „post“ (blog entry). This is a problem, as WordPress internally uses the same search function to search in the media library. Images or attachments in general in WordPress are saved with the post_type „attachment“. So, they are ignored by the search function and search results in the media library are always empty. You can fix this by using the following piece of code:

# Remove static pages from search results
# Improved version by Florian Meier, www.flomei.de and Timo Reith, www.ifeelweb.de
# https://www.flomei.de/2012/11/23/seiten-aus-wordpress-suchergebnissen-ausschliesen-exclude-pages-from-wordpress-search-results/
function excludePagesfromSearch($query) {
if (!is_admin() && $query->is_search) {
$query->set('post_type', array('post','attachment'));
}
return $query;
}

add_filter('pre_get_posts','excludePagesfromSearch');

Wie zu sehen ist, wird hier als post_type ein Array übergeben, das neben „post“ auch „attachment“ enthält. Damit werden Seiten immer noch ausgeschlossen, Anhänge allerdings mit in die  Suche aufgenommen.

Das ist dann auch schon die ganze Magie hinter der Sache. Wenn dieser Post hilfreich war, dann immer fleißig tweeten, auf Facebook liken/teilen und sonstwie weiterverbreiten. ;-)

As you can see, post_type is passed an array which contains „attachment“ next to „post“. This way static pages are still excluded, but attachments are still within the search results.

That´s the whole magic. If you find this post useful, please tweet it, like/share it on Facebook and spread the word on other ways. ;-)


Update @ 2018-08-22
Vielen, vielen Dank an Timo von ifeelweb.de der mich auf einen Fehler im Code aufmerksam gemacht hat. Ein fehlendes !is_admin() kann dazu führen, dass Custom Post Types im Backend durch diese Funktion aufgegriffen und gefiltert werden, so dass einige Funktionen nicht mehr wie erwartet funktionieren. Die Prüfung ist jetzt im Code ergänzt und schließt damit Seiten im Backend aus. Danke Timo!

Many, many thanks to Timo from ifeelweb.de which pointed out an error in this code. A missing !is_admin() can lead to this function filtering custom post types in the backend which then leads to broken features or more. This check is now integrated into the code and prevents the filter from running in the backend. Thanks Timo!