Wordpress Recherche par catégories multiples

4

Depuis quelques mois, je me lance dans wordpress pour trouver plusieurs options de recherche par catégorie. Finalement, je suis arrivé à cela.

Je viens de constater que wordpress autorise plusieurs balises, ce qui signifie que si vous tapez dans cette URL

http://yourblog.com/tag/tag1+tag2

il renverra alors tous vos messages avec des balises, balise1 ET balise2

mais si vous tapez

http://yourblog.com/tag/tag1,tag2

alors tous les articles ayant tag1 OU tag2

seront renvoyés.

La même chose fonctionne maintenant pour les catégories aussi

http://yourblog.com/category/cat1+cat2 et http://yourblog.com/category/cat1,cat2

Mais cela ne fonctionne que pour les catégories et les tags, je l’essaye comme option de recherche.

Jusqu'à présent, j'ai codé l'emplacement de cette URL (ce qui signifie qu'il recherchera le HTML uniquement dans l'ID de catégorie 114),

http://yourblog.com/?s=html&cat=114

Dans cette URL, le séparateur de virgule fonctionne très bien, mais pas le +

.

Je veux dire

http://yourblog.com/?s=html&cat=114,115

fonctionne très bien mais

http://yourblog.com/?s=html&cat=114+115

ne fonctionne pas.

Quelqu'un peut-il m'aider dans ce domaine? Je veux vraiment que cela fonctionne

J'attends toujours

    
posée Niraj Chauhan 29.08.2011 - 05:58

3 réponses

4

Le problème est que dans une url, le signe '+' est équivalent à un espace, donc c'est comme ça que PHP le voit.

Si vous utilisez une action sur parse_request , vous pouvez faire en sorte que cela fonctionne comme suit:

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

Les éléments ci-dessus obtiendront les identifiants de catégories passés entre '+' entre eux en les séparant sur un espace correspondant à ce que PHP voit dans le paramètre $ _GET.

Si nous avons plusieurs éléments dans le tableau, il doit s'agir d'une recherche de style "et" afin que nous puissions passer du tableau de fractionnement de l'espace à la variable 'category__and' query var qui renvoie des messages dans toutes les catégories spécifiées.

    
réponse donnée sanchothefat 31.10.2011 - 11:54
1

Essayez ceci: http://yourblog.com/?s=html&cat[]=114&cat[]=115

BTW, pourquoi ne pas utiliser un lien de pointage pre_get_posts pour filtrer votre recherche? Ce serait beaucoup plus facile que de peaufiner l'URL de recherche.

    
réponse donnée Anh Tran 31.08.2011 - 03:31
1

La solution suggérée par @sanchothefat est OK, mais pose des problèmes lorsque la pagination est utilisée. Par exemple, vous avez une URL telle que domain.com/?s=&cat=1+2. Lorsque vous cliquez sur la page 2, l'URL devient domaine.com/?s=&cat=1+2 mais redirect_canonical () défini dans wp-includes / canonical.php tente de modifier l'URL en domaine.com/?s&cat. = 12 ce qui n'est pas pareil ... Il m'est plus facile de réécrire category_search_logic () plutôt que d'enquêter sur la logique redirect_canonical () et d'appliquer des filtres supplémentaires.

C’est ma façon d’abandonner la logique canonique:

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;
}
    
réponse donnée stz184 21.01.2014 - 08:31

Lire d'autres questions sur les étiquettes