it-swarm.com.de

Wordpress Multiple Category Search

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

5
Niraj Chauhan

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.

5
sanchothefat

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;
}
1
stz184

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.

1
Anh Tran