Seit einigen Monaten beschäftige ich mich mit WordPress für mehrere Kategoriensuchoptionen und habe es mir schließlich ausgedacht.
Ich habe gerade herausgefunden, dass WordPress mehrere Tags zulässt, was bedeutet, dass Sie dies eingeben, wenn Sie eine URL eingeben
http://yourblog.com/tag/tag1+tag2
dann werden alle Ihre Posts mit den Tags tag1UNDtag2 zurückgegeben
aber wenn Sie tippen
http://yourblog.com/tag/tag1,tag2
dann werden alle Beiträge mit tag1ODERtag2 zurückgegeben
Dasselbe funktioniert jetzt auch für Kategorien
http://yourblog.com/category/cat1+cat2
und http://yourblog.com/category/cat1,cat2
Dies funktioniert jedoch nur für Kategorien und Tags. Ich versuche es für die Suchoption.
Bis jetzt habe ich codiert, wo diese URL funktioniert (was bedeutet, dass HTML nur in der Kategorie-ID 114 durchsucht wird).
http://yourblog.com/?s=html&cat=114
In dieser URL funktioniert das Komma-Trennzeichen sehr gut, aber nicht das +
Ich will sagen
http://yourblog.com/?s=html&cat=114,115
funktioniert aber sehr gut
http://yourblog.com/?s=html&cat=114+115
funktioniert nicht.
Kann mir jemand dabei helfen? Ich möchte wirklich, dass das funktioniert
Ich warte immer noch
Das Problem ist, dass in einer URL das '+' - Zeichen einem Leerzeichen entspricht, so sieht es PHP.
Wenn Sie eine Aktion für parse_request
verwenden, können Sie dies folgendermaßen ausführen:
add_action( 'parse_request', 'category_search_logic', 11 );
function category_search_logic( $query ) {
if ( ! isset( $query->query_vars[ 'cat' ] ) )
return $query;
// split cat query on a space to get IDs separated by '+' in URL
$cats = explode( ' ', $query->query_vars[ 'cat' ] );
if ( count( $cats ) > 1 ) {
unset( $query->query_vars[ 'cat' ] );
$query->query_vars[ 'category__and' ] = $cats;
}
return $query;
}
Die oben genannten IDs werden mit '+' dazwischen übergeben, indem sie auf ein Leerzeichen aufgeteilt werden, das PHP im Parameter $ _GET anzeigt.
Wenn das Array mehr als ein Element enthält, muss es sich um eine Suche im 'und'-Stil handeln, damit das Array von der Aufteilung des Leerzeichens in die 'category__and'
-Abfragevariable weitergeleitet werden kann, die Beiträge in allen angegebenen Kategorien zurückgibt.
Die von @sanchothefat vorgeschlagene Lösung ist in Ordnung, führt jedoch zu Problemen, wenn Paginierung verwendet wird. Beispielsweise haben Sie eine URL wie domain.com/?s=&cat=1+2. Wenn Sie auf Seite 2 klicken, wird die URL zu domain.com/?s=&cat=1+2, aber redirect_canonical (), definiert in wp-includes/canonical.php, versucht, die URL zu domain.com/?s&cat=12 zu ändern nicht dasselbe ... Ich fand es einfacher, category_search_logic () neu zu schreiben, statt redirect_canonical () zu untersuchen und zusätzliche Filter darauf anzuwenden.
Dies ist mein Weg, um die kanonische Logik zu umgehen:
function category_search_logic( $query ) {
if ( ! isset( $_GET['categories'] ) )
return $query;
// split cat query on a space to get IDs separated by ',' in URL
$cats = explode(',', $_GET['categories'] );
if ( count( $cats ) > 1 ) {
unset($_GET['categories']);
$query->query_vars[ 'category__and' ] = $cats;
}
return $query;
}
Versuchen Sie dies: http://yourblog.com/?s=html&cat[]=114&cat[]=115
BTW, warum benutzt du keinen Hooklink pre_get_posts
um deine Suche zu filtern? Es wäre viel einfacher, als die Such-URL zu ändern.