Ich versuche, die Suchergebnisse für eine allgemeine Suche anzupassen, aber nur wenn die Vorlage search.php
verwendet wird. Ich habe andere Suchanfragen auf meiner Website, und ich möchte nicht, dass dieser Filter sie stört. Alles funktioniert mit dem folgenden Code, mit Ausnahme von is_page_template('search.php')
.
Sobald ich diese Codezeile als Bedingung eingebe, wird nur die normale Suchfilterung wiederhergestellt, da meine IF-Bedingung fehlschlägt. Wie führe ich meinen Code nur aus, wenn wir auf der Seite search.php
sind?
//Filter the search for only posts and parts
function SearchFilter($query)
{
if ($query->is_search && is_page_template('search')) {
$query->set('post_type', array('post', 'parts'));
$query->set('meta_key', 'Manufacturer');
$query->set('orderby', 'meta_value');
$query->set('order', 'ASC');
}
return $query;
}
add_filter('pre_get_posts', 'SearchFilter');
Es gibt eine Problemumgehung, die möglicherweise eine zusätzliche Abfrage kostet. @Milo hat jedoch einmal erwähnt, dass WordPress das Zwischenspeichern von Abfragen ziemlich schlau macht, sodass dies für Sie keine große Sache sein sollte.
Sie können die Abfrage im pre_get_posts
ausführen und dann einige Überprüfungen durchführen. Wenn die Situation Ihren Anforderungen entsprach, filtern Sie die Abfrage:
//Filter the search for only posts and parts
function SearchFilter($query)
{
remove_action('pre_get_posts', 'SearchFilter');
// Run the query to fetch the results
$posts = get_posts( $query->query );
if(!empty($posts)) {
// Check the template for the first post
if( get_page_template_slug( $posts[0]->ID ) == 'YOUR SLUG HERE' ){
$search_template = true;
} else {
$search_template = false;
}
}
// Now filter the posts
if ($query->is_main_query() & $query->is_search && $search_template) {
$query->set('post_type', array('post', 'parts'));
$query->set('meta_key', 'Manufacturer');
$query->set('orderby', 'meta_value');
$query->set('order', 'ASC');
}
return $query;
}
add_action('pre_get_posts', 'SearchFilter');
Lassen Sie es uns Schritt für Schritt aufschlüsseln:
if ($query->is_search && is_page_template('search')) {
Hier gibt es 3 Probleme
is_page_template
search.php
ist keine Seitenvorlage, daher wird die Suchvorlage nicht geladen. Das wird also nicht funktionieren.
Aber wenn es funktioniert hat, gibt es ein neues Problem. Funktionen wie is_page_template
usw. hängen von der Hauptabfrage ab, aber wir befinden uns in einem pre_get_posts
-Filter. Sie wissen nicht, ob diese Abfrage bereits festgelegt wurde oder ob Sie diese oder eine andere Abfrage filtern.
Also müssen wir:
is_page_template
Prüfung, es tut nicht was Sie denken, dass es tut$query->is_main_query()
-Prüfung hinzu, damit der Filter Widgets und andere Abfragen nicht beeinträchtigtif ($query->is_search
Dies funktioniert nicht und sollte PHP Warnungen für Sie generieren. Das Problem ist, dass is_search
eine Funktion/Methode ist, keine Variable. Es sollte sein:
if ( $query->is_search() && $query->is_main_query() ) {
search.php
?WordPress entscheidet anhand der Hauptabfrage, welche Vorlage geladen wird. Wenn es die Hauptabfrage ist und is_search
wahr ist, wird search.php
geladen.
Aus diesem Grund hat WordPress nicht entschieden, welche Vorlage verwendet werden soll, wenn Ihr Filter auftritt. Tatsächlich können Sie WordPress veranlassen, die geladene Vorlage zu ändern, indem Sie die Abfragevariablen ändern. Wenn Sie zum Beispiel alle Variablen deaktivieren und zum Laden eines einzelnen Posts auffordern, erhalten Sie wahrscheinlich keinen search.php
oder überhaupt kein Archiv. Stattdessen erhalten Sie wahrscheinlich single.php
is_main_query
wird falsch sein, also kein Problem