web-dev-qa-db-fra.com

Archiver les fonctions de tri par champs personnalisés (front-end)

Je souhaite donner aux utilisateurs la possibilité de trier les articles de l'archive en fonction de champs personnalisés que je prédéfinis.

Le résultat final serait un conteneur à onglets, et l'utilisateur cliquera sur le lien de filtrage approprié qu'il/elle souhaite voir.

Par exemple: http://www.metacritic.com/browse/games/genre/date/action/all

Je veux:
- Filtrer par date
- Filtrer par titre
- Filtrer par meta_key

Est-ce possible?

Merci pour toute aide .. :)

3
Martin-Al

NOTES: En ce qui concerne la réponse de Jan Fabry ... Assurez-vous de nettoyer d'abord les données entrantes, sinon vous vous ouvrez à toutes sortes de chaînes de requêtes désagréables.

Vous devriez également probablement renvoyer les données entrantes sur ce filtre, renvoyer $ query, à la place de return;

Je pense également qu’il serait préférable d’avoir un tableau de valeurs possibles ou de faire une requête sur les méta-valeurs possibles. Vous pouvez ainsi créer un commutateur capable de comparer les correspondances des valeurs entrantes à l’une de ces valeurs possibles (moyen plus simple de nettoyer les données venant).

Pas un utilisateur régulier ici, sinon je posterais un exemple (je ne sais pas comment le code de publication fonctionne ici - je ne le trouvais pas dans la FAQ).

EDIT: Merci pour l’affiche qui m’a pointée vers info pour l’affichage du code.

L'exemple suit, j'espère que ça fonctionnera bien ... :)

// Only add the needed meta orders
$possible_orders = array( 'some_meta_key', 'some_other_meta_key' );

add_filter( 'pre_get_posts', 'archive_meta_sorting' );
function archive_meta_sorting( $query_object ) {
    if( !is_archive() || is_admin() )
        return $query_object;

    if( !isset( $_GET['orderby'] ) )
        return $query_object;

    global $possible_orders;

    $orderby = trim( $_GET['orderby'] );    

    switch( $orderby ) {
        case( in_array( $orderby, $possible_orders ) ):
            $query_object->set( 'orderby', 'meta_value' );
            $query_object->set( 'meta_key', $orderby );
            break;
        // You don't actually need these two cases below, it will work without them
        // The switch could actually just be a simple if in_array condition..
        case 'title':
            $query_object->set( 'orderby', 'title' );
            break;
        case 'date':
            $query_object->set( 'orderby', 'date' );
            break;
    }
    return $query_object;
}

Il vous suffit de passer des valeurs pour le méta-tri, le titre et la date fonctionneront parfaitement en utilisant le support natif pour la commande par ces valeurs, on peut en dire de même pour la commande (desc ou asc).

J'espère que ça aide ...

2
t31os

C'est certainement possible, mais sa simplicité dépend de la propreté de l'URL. Si cela ne vous dérange pas d'ajouter ?orderby=[fieldname]&order=[asc or desc], vous pouvez simplement l'essayer. Ajouter ?orderby=title&order=asc à une page d’archive sera en effet ordonné par titre avec le "A" avant le "Z" (l’ordre par défaut est décroissant, car c’est logique dans l’ordre par date).

Si vous voulez commander avec une clé méta, dites rating, vous ne pouvez pas simplement ajouter orderby=rating, mais vous devez aussi indiquer à la fonction WP_Query::get_posts() que vous souhaitez inclure cette clé méta dans la requête . La meilleure façon de le faire est probablement de s’associer à l’action pre_get_posts, où vous pouvez vérifier la présence de ce champ de commande et l’ajouter au query_vars de l’objet si nécessaire. Quelque chose comme ça (mais non testé):

add_action('pre_get_posts', 'check_meta_sort');
function check_meta_sort(&$query)
{
    if (!isset($_GET['orderbymeta'])) {
        return;
    }
    $query->query_vars['meta_key'] = $_GET['orderbymeta'];
    $query->query_vars['orderby'] = $_GET['orderbymeta'];
}

Si vous voulez des "jolies" URLs se terminant par /title, /date, /[meta-key], vous devrez vous pencher sur le moteur de réécriture, mais je ne peux pas vous aider ( encore ).

1
Jan Fabry