Jak wykluczyć wybrane treści z wyników wyszukiwania (i nie tylko)

Wykluczanie treści z wyszukiwania

Wbudowana wyszukiwarka WordPressa nie jest idealna, ale ma tę zaletę, że potrafi przeszukiwać wszystkie treści istniejące w naszym serwisie – niezależnie od tego, czy opublikujemy je w formie strony, zwykłego wpisu czy też wpisu własnego (niestandardowego) typu. Nie zawsze jednak takie działanie wyszukiwarki jest pożądane i czasem możemy chcieć ukryć niektóre treści w wynikach wyszukiwania. Na szczęście są na to bardzo proste sposoby.

Search Exclude – wykluczanie pojedynczych stron lub wpisów

Search ExcludeWtyczka Search Exclude pozwala na wykluczenie z wyników wyszukiwania dowolnej strony lub wpisu. Wystarczy zaznaczyć checkbox Exclude from Search Results i zapisać zmiany przyciskiem Zaktualizuj. Wtyczka działa również z własnymi typami wpisów, tak więc można w ten sposób na przykład wykluczyć z wyników wyszukiwania wybrane produkty ze sklepu zbudowanego w oparciu o wtyczkę WooCommerce.

Search Exclude - lista wykluczonych stron i wpisów

Na stronie Ustawienia → Search Exclude znajdziemy listę wszystkich wykluczonych z wyszukiwania treści. To bardzo przydatna funkcja, szczególnie gdy w naszym serwisie mamy dużo wpisów i chcemy szybko zobaczyć te, które wykluczyliśmy. Odznaczając wybrane wpisy i klikając przycisk Zapisz zmiany możemy usunąć ich wykluczenie.

Dodatkowo informacja o widoczności wpisu w wynikach wyszukiwania jest wyświetlana na liście wpisów w panelu administracyjnym (kolumna Search Exclude).

Wtyczka Search Exclude sprawdzi się idealnie do wykluczania z wyszukiwania ręcznie wybranych treści. Jest mała, lekka i prosta w obsłudze. Nie zda jednak egzaminu gdy chcemy wykluczyć całe kategorie czy typy wpisów.

Simply Exclude – zaawansowane ukrywanie treści

Wtyczka Simply Exclude pozwala na usuwanie z wyników wyszukiwania zarówno pojedynczych treści, jak i całych taksonomii (tagi, kategorie, własne taksonomie), typów wpisów czy wszystkich stron. Co więcej, pozwala również na ukrywanie wybranych treści na stronie głównej (tak jak na przykład zrobiłem to na WPzen z Promocjami), w kanale RSS, na stronach archiwów, a nawet w niektórych widgetach. To naprawdę potężne narzędzie, które ma dość rozbudowaną konfigurację.

W najprostszym wariancie, gdy chcemy na przykład wykluczyć kategorię z wyników wyszukiwania, nie ma tu wielkiej filozofii. Wystarczy że w panelu administracyjnym przejdziemy do listy kategorii (Wpisy → Kategorie) i zaznaczymy interesującą nas opcję w kolumnie Simply Exclude. Zapisanie zmian jest sygnalizowane podświetleniem wybranej opcji na żółto.

Simply Exclude - kategorie

Dostępne są opcje wykluczenia kategorii z archiwów (Archives), kanałów RSS (Feeds), strony głównej lub strony z wpisami (zależnie od konfiguracji naszej strony – Front/Home), wyników wyszukiwania (Searches) oraz widgetów Kategorie (Widget: Categories) i Chmura Tagów (Widget: Tag Cloud). Niemal identyczne opcje są dostępne na liście tagów oraz dowolnej własnej taksonomii.

Analogiczne opcje (czasem może być ich mniej) są dostępne na listach wpisów i stron, a także na stronie edycji wpisu. Wszędzie działają i wyglądają podobnie, więc nie będę ich dokładnie opisywał. Jeśli któraś z opcji nie działa lub działa w dziwny sposób, to należy przejść do ustawień wtyczki, bo tam najprawdopodobniej kryje się przyczyna problemów.

Ekran konfiguracji wtyczki (Simply Exclude → Settings) składa się z trzech zakładek: Taxonomies (taksonomie), Post Types (typy wpisów) i Users (użytkownicy). Na każdej z nich znajdziemy opcje określające sposób działania wtyczki dla poszczególnych elementów naszej strony.

Simply Exclude - ustawienia

Jako przykład weźmy opcje dla standardowych wpisów. Opcja Active wyłącza (Disabled) wtyczkę dla danego typu wpisów. Oznacza to, że wszystkie ustawienia, jakich dokonaliśmy dla poszczególnych wpisów, przestaną działać.

Grupa Actions określa sposób działania poszczególnych opcji na liście wpisów i na ekranie edycji wpisu. Dla każdej lokalizacji (archiwa, kanały RSS, strona główna i wyniki wyszukiwania) są dostępne dwie lub trzy możliwości. Include only oznacza, że wyświetlane będą tylko wybrane wpisy (czyli te, przy których ustawimy „ptaszka”). Exclude (opcja zalecana) oznacza, że tylko wybrane wpisy będą wykluczone. Include All (tylko dla kanałów RSS i strony głównej) oznacza, że wszystkie wpisy danego typu będą wyświetlane w wybranym miejscu (domyślnie własne typy wpisów nie są dołączane do kanału RSS i nie są pokazywane na stronie głównej).

Opcja Show/Hide włącza lub wyłącza wyświetlanie opcji wykluczania na liście wpisów. Jest to wygodne gdy nie mamy zamiaru ustawiać niczego dla pojedynczych wpisów, a jedynie masowo, dla typu wpisu i/lub kategorii.

Ostatnia opcja Query Filtering określa czy wtyczka filtruje wpisy tylko w pętli głównej (Main Loop Only) czy też we wszystkich pętlach na stronie (All Loops). Włączenie tej drugiej opcji ma sens tylko wtedy, gdy używany przez nas motyw wyświetla lub filtruje wpisy w jakiś własny, nie do końca typowy sposób i wtyczka nie współpracuje z nim tak jak trzeba.

Opcje dla pozostałych typów wpisów, dla taksonomii oraz użytkowników wyglądają i działają dokładnie tak samo.

Wtyczka Simply Exclude, wbrew swojej nazwie, jest dość rozbudowana i ilość dostępnych opcji może przytłoczyć mniej zaawansowanych użytkowników. Mogę jednak zapewnić, że to tylko wygląda strasznie i po kilku minutach (i ustawieniu wszędzie opcji Exclude) wszystko powinno działać jak trzeba.

Zaawansowane wykluczanie treści

Jeśli nie chcemy korzystać z wtyczek albo po prostu wolimy wszystko robić samodzielnie, to można oczywiście wykluczać wybrane treści za pomocą prostych kawałków kodu, umieszczanych w pliku functions.php motywu lub plikach wtyczki. Użyjemy do tego filtra pre_get_posts, który pozwala na niemal dowolne modyfikowanie zapytania wyciągającego wpisy.

Ogólna struktura kodu naszego filtra będzie taka sama, niezależnie od tego co i jak chcemy filtrować.

Wykluczenie z wyników wyszukiwania wybranej kategorii wpisów (musimy znać ID kategorii – w przykładzie 168):

function wpzen_exclude_content($query) {
	if($query->is_search()) {
		$query->set('cat', '-168');
	}
	return $query;
}
add_filter('pre_get_posts', 'wpzen_exclude_content');

Uwzględnianie w wynikach wyszukiwania tylko wpisów (bez stron):

function wpzen_exclude_content($query) {
	if($query->is_search()) {
		$query->set('post_type', 'post');
	}
	return $query;
}
add_filter('pre_get_posts', 'wpzen_exclude_content');

Wykluczenie wybranych wpisów z wyników wyszukiwania (musimy znać ID tych wpisów):

function wpzen_exclude_content($query) {
	if($query->is_search()) {
		$query->set('post__not_in', array(7, 15, 33));
	}
	return $query;
}
add_filter('pre_get_posts', 'wpzen_exclude_content');

W analogiczny sposób możemy wykluczać treści ze strony głównej:

function wpzen_exclude_content($query) {
	if($query->is_home()) {
		$query->set('cat', '-168');
	}
	return $query;
}
add_filter('pre_get_posts', 'wpzen_exclude_content');

Albo z kanałów RSS:

function wpzen_exclude_content($query) {
	if($query->is_feed()) {
		$query->set('cat', '-168');
	}
	return $query;
}
add_filter('pre_get_posts', 'wpzen_exclude_content');

Na podstawie podanych przykładów można zbudować praktycznie dowolny filtr, zmieniając warunek (dostępne funkcje) i ustawiając dodatkowe parametry zapytania (dostępne parametry).

Bezpośredni link