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