WordPress : Autoriser le filtrage des boucles pour toutes les catégories

Publié par Jean-Michel le

Je souhaite donner la possibilité de filtrer la page d’index et chaque page d’archives d’une catégorie par des éléments tels que les plus récents, les mieux notés, les plus consultés. Je sais comment filtrer une boucle pour chacun d’eux mais j’ai besoin d’une solution pour passer à chaque boucle filtrée.

Solution n°1 trouvée

Je recommanderais de définir une requête var pour définir vos filtres personnalisés, puis de transmettre la valeur (assainie) de cette requête var à query_posts()(pour modifier la boucle principale, si tel est votre objectif).

Tout d’abord (dans functions.php), définissez votre requête var :

<?php
function wpse47974_queryvars( $qvars )
{
$qvars[] = 'wpse47974_filter';
return $qvars;
}
add_filter( 'query_vars', 'wpse47974_queryvars' );
?>

Ensuite, dans le modèle, interrogez votre requête var. Je suppose que vous avez un ensemble prédéfini de filtres, défini dans un tableau,$wpse47974_valid_filters :

<?php
// Query Tag Filter
$wpse47974_filter = '';
if ( isset( $wp_query->query_vars['wpse47974_filter'] ) && in_array( $wp_query->query_vars['wpse47974_filter'], $wpse47974_valid_filters ) ) {
    $wpse47974_filter = $wp_query->query_vars['wpse47974_filter'];
}
?>

Ensuite (quelque part), vous devrez définir vos paramètres de requête en fonction de vos types de filtres. Je laisse cela comme un exercice pour le PO ; cependant, dans le code suivant, ces paramètres de requête sont représentés par  » $wpse47974_filter_args['key'] => 'value';« , et nous les ajoutons à un tableau, ici (dans le fichier de modèle) :

<?php
// Define an empty array to hold our filter parameters.
// This needs to be an array, in order not to generate
// errors later in the array_merge(), if no filter parameters
// are being applied to the default query
$wpse47974_filter_args = array();

// If our query var is set, apply the filter parameter
if ( '' != $wpse47974_filter  ) {
    $wpse47974_filter_args['key'] = 'value';
};
?>

Ensuite, toujours dans le fichier modèle, fusionnez la requête par défaut avec nos paramètres de filtre ci-dessus, à modifier query_posts()(note : avant de sortir la boucle) :

<?php
// Globalize $wp_query
global $wp_query;
// Merge the default query with our filter parameters
$wpse47974_query_posts_args = array_merge( $wp_query->query, $wpse47974_filter_args );
// Modify the default query
query_posts( $wpse47974_query_posts_args );
?>

Maintenant, la requête de boucle principale est modifiée selon votre filtre.

Éditer

J’ai oublié une partie importante : comment insérer les variables de requête dans l’URL !

Dans votre modèle, où vous avez vos liens de filtre (ou boutons, ou autre), je suppose que vous avez une ancre HTML. Définissez l’ hrefattribut comme suit, à l’aide de la add_query_arg()fonction :

<a href="<?php echo add_query_arg( array( 'wpse47974_filter' => 'value' ) ); ?>">FILTER NAME</a>

Maintenant, lorsque vous cliquez sur le lien, la page est rechargée, avec votre requête var ajoutée à l’URL.

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *