web-dev-qa-db-fra.com

Wordpress Recherche par catégories multiples

En quelques mois, je me suis mis à chercher dans WordPress de multiples options de recherche par catégorie.

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

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

alors il retournera tous vos messages avec des tags, tag1 ET tag2

mais si vous tapez

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

alors il retournera tous les articles ayant tag1 OU tag2

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 du 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 à cet égard? Je veux vraiment que ça marche

Toujours en attente

5
Niraj Chauhan

Le problème est que dans une url, le signe '+' est équivalent à un espace. C'est ainsi 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;
}

Ce qui précède obtiendra les identifiants de catégorie passés avec un '+' entre eux en les séparant sur un espace 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 à partir de la scission de l'espace à la variable 'category__and' qui renvoie des publications dans toutes les catégories spécifiées.

5
sanchothefat

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 vers domaine.com/?s&cat=12 qui est pas la même chose ... Il m'est plus facile de réécrire category_search_logic () plutôt que d'enquêter sur la logique redirect_canonical () et de lui 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;
}
1
stz184

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

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

1
Anh Tran