2017-10-20 48 views
0

J'ai un problème que j'essaie de résoudre en ce moment et d'avoir un problème pour trouver un moyen de le faire correctement.Wordpress trier par valeurs meta

J'ai une série de cours de collège que j'ai besoin de trier je peux le trier par un champ méta pour l'année juste très bien. Mais quand j'arrive à trier par semestre, il le trie en ordre alphabétique et il finit par trier par Hiver, Printemps, Automne ou Automne, Printemps, Hiver selon si je lui dis ASC ou DESC.

J'ai besoin de savoir comment faire pour cela dans l'ordre de préférence sans ajouter un autre champ aux postes de priorité de tri

requêtes args actuellement écrites comme suit ce qui est évidemment un peu en désordre.

$args = array(
       'post_type' => 'mcm_geri-ed', 
       'posts_per_page' => $posts_per_page, 

       'meta_query' => array(
        'semester' => array(
         'key' => 'semester', 

       ), 
        'year' => array(
         'key' => 'year' 
       ) 
      ), 
       'orderby' => array(

        'year' => 'DESC', 
        'semester' => array(
        'value' => 'date' 
       ) 
      ), 
       'paged' => $paged 
      ); 

Répondre

1

Je ne pense pas qu'il existe un moyen de faire cela avec WP_Query directement. Que diriez-vous d'utiliser posts_orderby et de manipuler la partie ORDER du SQL pour être quelque chose comme meta_year DESC, meta_semester = 'Spring' DESC, meta_semester = 'Fall' DESC. Regardez le SQL généré pour voir les noms que vous devriez utiliser pour meta_year et meta_semester (ou quarter, vraiment).

Ce n'est pas aussi efficace que de changer le semestre en valeur numérique et d'ajouter le nom lors de la sortie, mais cela fonctionnera.

+0

Je recommanderais cela aussi - ou les sélectionner tous et faire le tri manuellement s'il n'y en a pas trop. Il devrait être possible de faire avec WP_Query cependant. – Mikk3lRo

+1

Je suis d'accord sur le principe, mais j'utiliserais de préférence 'FIND_IN_SET (meta_semester, 'Fall, Spring, Winter') ASC'. FIND_IN_SET renvoie la position du premier argument dans la deuxième chaîne séparée par des virgules. Ils doivent donc être listés dans l'ordre souhaité. – CBroe

+1

Je reprends mon commentaire sur le fait que ce soit possible avec WP_Query après une heure d'essai. Vous pouvez [ajouter la capacité] (https://gist.github.com/mikeschinkel/6402058) cependant. Et il est assez facile d'utiliser le hook 'posts_orderby' comme suggéré par janh. – Mikk3lRo

0

C'est ce que j'ai finalement fait. C'était quelque chose de différent de ce qui était suggéré mais en utilisant le filtre suggéré pour obtenir le résultat. L'instruction if a quelques autres réserves ajoutées à cause de la façon dont j'ai construit un système de tri pour le modèle de page. J'ai aussi écrit ceci dans un environnement de test, d'où le type de message différent du code original.

// Custom Orderby filter to return the correct order for semester values. 
add_filter('posts_orderby', 'orderby_pages_callback', 10, 2); 
function orderby_pages_callback($orderby_statement, $wp_query) { 
    //Making sure this only happens when it needs to. Which is the right post type and if it isn't getting sorted by other functions. 
    if ($wp_query->get("post_type") === "test_semester" && !is_admin() && !isset($_GET['order']) && !isset($_GET['sort'])) { 
     return "CAST(mt1.meta_value AS CHAR) DESC, wp_postmeta.meta_value = 'Fall' DESC, wp_postmeta.meta_value = 'Winter' DESC, wp_postmeta.meta_value = 'Spring' DESC,wp_postmeta.meta_value = 'Summer' DESC"; 

    } else { 
     //return your regularly scheduled programming 
     return $orderby_statement; 
    } 
}