J'utilise la technique décrite ici Séparation des résultats de recherche personnalisés et ici posts_groupby problem pour séparer mes résultats de recherche et les regrouper par type de message. Cela signifie que j'ai le code suivant.
Dans functions.php
add_filter('posts_orderby', 'group_by_post_type', 10, 2);
function group_by_post_type($orderby, $query) {
global $wpdb;
if ($query->is_search) {
return $wpdb->posts . '.post_type DESC';
}
// provide a default fallback return if the above condition is not true
return $orderby;
}
Dans search.php
<?php $last_type="";
$typecount = 0;
while (have_posts()){
the_post();
if ($last_type != $post->post_type){
$typecount = $typecount + 1;
if ($typecount > 1){
echo '</ol>'; //close type container
}
// save the post type.
$last_type = $post->post_type;
//open type container
switch ($post->post_type) {
case 'post':
echo "<h2>News Articles</h2><ol>";
break;
case 'page':
echo "<h2>Pages</h2><ol>";
break;
case 'work':
echo "<h2>Projects</h2><ol>";
break;
case 'bootlegs':
echo "<h2>Bootlegs</h2><ol>";
break;
case 'directors':
echo "<h2>Directors</h2><ol>";
break;
//add as many as you need.
}
} ?>
Cela fonctionne parfaitement sauf que je n'ai aucun contrôle sur l'ordre d'affichage des types de publication personnalisés. Je suppose qu'ils sont commandés par un numéro d'identification interne, mais je dois les contrôler.
Comment puis-je atteindre cet objectif?
Merci!
Quel type de contrôle voulez-vous exactement? Il existe, par exemple, des plugins qui fournissent une interface utilisateur à travers laquelle vous pouvez commander des publications en fonction de divers paramètres.
Si vous souhaitez simplement les classer tous selon un paramètre qui ne changera pas, vous pouvez simplement l'ajouter à votre requête (puisque vous pouvez commander selon plusieurs conditions ):
if ($query->is_search) {
return $wpdb->posts . '.post_type DESC, title DESC';
}
Edit:voici une autre question vous pourriez trouver utile.
Dans ce cas, l'ordre de repli (secondaire) est le titre.
Dans functions.php
:
add_filter( 'pre_get_posts', 'ordering_post_title_type');
function ordering_post_title( $query ) {
if ( $query->is_search ) {
$query->set('orderby','type title');
$query->set('order','ASC');
}
return $query;
}