web-dev-qa-db-fra.com

Interroger les publications dans un ordre prédéfini

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?

4
Imran

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);

3.5+

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

4
Stephen Harris

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é!

1
kovshenin

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.

0
jmarceli

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:

  • pour poster avec id = 17983 définir un champ personnalisé nommé my_custom_order = 1
  • for post with id = 18030 définissez un champ personnalisé nommé my_custom_order = 2
  • for post with id = 18016 définir un champ personnalisé nommé my_custom_order = 3
  • tu obtiens le point

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.

0
Bainternet

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.

0
Xhynk