2013-02-21 1 views
0

J'ai des problèmes pour commander une boucle! Je souhaite afficher les publications dans un style Compte à rebours (5, 4, 3, 2, 1), mais en utilisant des métadonnées et des données saisies par l'utilisateur.Compenser les postes et modifier une WP_query la bonne façon

J'ai ces données:

Post A with meta data (score = 2) 
Post B with meta data (score = 4) 
Post C with meta data (score = 6) 
Post D with meta data (score = 8) 
Post E with meta data (score = 10) 

utilisateur Exemple veut afficher un top 3 compte à rebours, de sorte user_input $ = 3.

La page devraient alors: Post C, Post D, Post E . (commandé par meta score et montrant le meilleur score en dernier).

J'ai une boucle de wp_query comme si:

$args = array('meta_key' => 'score', 'orderby' => 'meta_value_num', 'order' => 'ASC', 'posts_per_page' => $user_input); 
    $qry= new WP_Query($args); 
     $count_posts = $qry->post_count; 
     $offset = $count_post - $user_input 
     while ($qry->have_posts() ) : $qry->the_post(); 
       // echo stuff 

Il fonctionne, sauf que parce qu'il est réglé sur commande = ASC et les messages par page est maintenant fixé à 3 (quand il y a 5 postes de la catégorie) il montre le Post A, le Post B, le Post C. Et c'est ce dont j'ai besoin pour le montrer sauf qu'il devrait être C, D, E. J'ai pensé que je devais décaler le wp_query, mais je ne peux pas ajouter un 'offset' dans le tableau args parce que je ne sais pas combien de messages sont dans la catégorie. Je dois faire un post_count après la WP_Query et soustraire user_input pour savoir combien je dois compenser. C'est pourquoi j'ai mis le calcul pour $ offset.

Ma question est. Comment modifier la WP_query de la bonne façon? Est-ce qu'un

query_posts('offset'.$offset.'&showposts'.$user_input) 

après le décalage est calculé une mauvaise façon de le faire parce qu'il fait une autre requête?

Est-il possible d'ajouter facilement un paramètre à wp_query après qu'il a déjà été défini?

Merci les gars

+0

Essayez de changer votre argument ' « ordre »=> « ASC »,' avec ' 'ordre '=>' DESC ', '. – Rikesh

+0

Cela montre les "3 meilleurs scores" mais ils se font écho dans le mauvais sens. J'ai besoin d'eux pour faire écho, C, D, E, DESC écho = E, D, C. – user1202292

+0

Un quickfix serait réglé '' order '=>' DESC'' pour obtenir les 3 plus gros scores, puis utilisez * $ qry-> get_posts() * et * array_reverse() * le trier dans l'ordre que vous voulez. Par exemple. ' get_posts()); ?> '. La seule différence dans la boucle est que vous bouclez normalement à travers les éléments comme un tableau et utilisez la fonction [setup_postdata()] (https://codex.wordpress.org/Function_Reference/setup_postdata) au lieu de '$ qry-> the_post () ', en tant que tel:' ' – kjetilh

Répondre

0

A quickfix serait de changer l'ordre dans votre requête pour « DESC » au lieu de 'ASC. Cela vous obtiendra les 3 plus gros scores. Ensuite, vous pouvez récupérer les messages dans un tableau en utilisant mais ils seront toujours dans le mauvais ordre. Il suffit de faire un array_reverse() pour le trier dans l'ordre que vous voulez. La seule différence dans la boucle est que vous boucle normalement à travers les articles comme un tableau et utilisez la fonction setup_postdata() au lieu de $qry->the_post()

<?php 

// Set order to DESC 
$args = array('meta_key' => 'score', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'posts_per_page' => $user_input); 

$qry = new WP_Query($args); 

// Fetch the posts and reverse it to get the wanted order 
$posts = array_reverse($qry->get_posts()); 

foreach ($posts as $post) : setup_postdata($post); // sets up postdata in the same way as $qry->the_post(); 

    // ... 

endforeach; 

wp_reset_postdata(); // reset postdata after the loop 

?> 
+0

Merci encore;) – user1202292

Questions connexes