J'utilise la fonction query_posts pour répertorier 10 messages spécifiques qui sont recherchés par leur identifiant.
J'ai un tableau qui ressemble à ceci ..
Array
(
[0] => 17983
[1] => 17932
[2] => 18030
[3] => 18016
[4] => 17972
[5] => 18013
[6] => 18035
[7] => 17959
[8] => 18020
[9] => 18039
)
Je souhaiterais interroger les publications les montrant dans cet ordre spécifique, mais avec mon code, elles les affichent dans un ordre aléatoire.
Voici l'argument que j'utilise pour les posts de requête:
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
);
$ post_ids est le tableau que j'ai posté ci-dessus.
Comment puis-je modifier mon code pour interroger les publications et les afficher dans l'ordre du tableau?
Si la requête concerne uniquement un petit nombre de messages, alors, comme lié à Alex, vous pouvez trier en php. Cependant, cela ne va pas bien.
Comme suggéré par Kovshenin - une meilleure alternative consiste à utiliser le filtre posts_orderby
:
$post_ids = array(83,24,106,2283,14);
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
);
//Callback to filter the ORDER BY part of the query
function wpse67823_orderby_post_in($orderby, $query){
global $wpdb;
//Remove it so it doesn't effect future queries
remove_filter(current_filter(), __FUNCTION__);
$post__in = implode(',',$query->get('post__in'));
return "FIELD( {$wpdb->posts}.ID, $post__in )";
}
//Add filter and perform query
add_filter('posts_orderby','wpse67823_orderby_post_in',10,2);
$wpse67823_query = new WP_Query($args);
WordPress 3.5 verra une valeur supplémentaire acceptée par WP_Query
pour orderby
: 'post__in'. Voir ce ticket de transport: http://core.trac.wordpress.org/ticket/13729
Vous devrez pirater la requête SQL résultante au cours de posts_orderby
et utiliser la fonction ORDER BY FIELD()
de MySQL avec une liste séparée par des virgules de votre tableau. Voici plus d'informations sur la fonction FIELD
: http://www.electrictoolbox.com/mysql-order-specific-field-values/
Je l'ai fait il y a quelque temps, lorsque Sphinx a renvoyé une liste d'identifiants de publication classés par pertinence. J'ai donc dû les sélectionner avec WP_Query
dans le même ordre. FIELD()
pendant le filtre posts_orderby
a fonctionné comme un charme.
De plus, si vous utilisez query_posts
pour modifier la requête principale, ce n'est pas la meilleure façon de le faire. @Alex a mentionné WP_Query
, qui n'est pas vraiment différent de query_posts
et qui constitue également un mauvais moyen (de donner l'impression que vous ressemblez) de modifier la requête principale.
La méthode correcte consiste à utiliser l'action pre_get_posts
et à modifier l'objet $query
transmis par référence. Vous pouvez en apprendre plus sur pre_get_posts ici: http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
J'espère que c'est utile. À votre santé!
Basé sur @Stephen Harris answer, pour Wordpress 3.5+ l'option la plus simple semble être de commander par post__in
.
Voici l'exemple:
$post_ids = Array(12, 15, 18, 8, 10, 5);
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'numberposts' => 10,
'orderby' => 'post__in'
);
$posts = WP_Query($args); // or any other method that uses WP_Query args e.g. get_posts()
// as a result you will get posts in order: 12, 15, 18, 8, 10, 5
Je l'ai testé moi-même sur un site Wordpress 4.7 et cela fonctionne comme prévu.
Voici une solution de contournement plus simple pour y parvenir, créez simplement un champ personnalisé pour chacun de ces messages du même nom et définissez votre ordre souhaité, par exemple:
puis dans votre requête, commandez simplement par ce champ personnalisé:
$args = array(
'post_type' => 'post',
'post__in' => $post_ids,
'posts_per_page' => 10,
'meta_key' => 'my_custom_order',
'orderby' => 'meta_value',
'order' => 'ASC'
);
Remarque: Une fois cette opération effectuée (définissez le champ personnalisé pour ces publications), vous pouvez supprimer le paramètre 'post__in' => $post_ids,
puisque seules les publications ayant le champ personnalisé my_custom_order
seront interrogées à partir de la base de données.
Tout d’abord, n’utilisez pas query_posts()
, utilisez WP_Query()
.
Deuxièmement, changez votre tableau uniquement pour les identifiants de publication.
de:
[0] => 17983
[1] => 17932
à
array( 17983, 17932 )
EDIT: Cherchez ICI pour une référence.