J'utilise ce code pour afficher les 3 messages les plus populaires en fonction du nombre de commentaires:
<?php
$pop_posts = 3;
$popularposts = "SELECT $wpdb->posts.ID, $wpdb->posts.post_title, COUNT($wpdb->comments.comment_post_ID) AS 'stammy' FROM $wpdb->posts, $wpdb->comments WHERE comment_approved = '1' AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status = 'publish' AND comment_status = 'open' GROUP BY $wpdb->comments.comment_post_ID ORDER BY stammy DESC LIMIT ".$pop_posts;
$posts = $wpdb->get_results($popularposts);
if($posts){
foreach($posts as $post){
$post_title = stripslashes($post->post_title);
$guid = get_permalink($post->ID);
$thumb = get_post_meta($post->ID,'_thumbnail_id',false);
$thumb = wp_get_attachment_image_src($thumb[0], 'popular-posts-image', false);
$thumb = $thumb[0];
?>
<?php if ($thumb) { ?>
<img src="<?php echo $thumb; ?>" width=80 height=80 />
<?php } ?>
<h4><a href="<?php echo $guid; ?>" title="<?php echo $post_title; ?>"><?php echo $post_title; ?></a></h4>
<div class="clear"></div>
<?php
}
}
?>
mais je veux utiliser ce code à deux endroits différents, donc je veux compenser les 3 premiers postes. Est-il possible de compenser les trois postes? Merci
Voici votre code emballé dans un plugin. L'important est que prepare()
s soit entré, donc la requête est sécurisée. Vous pouvez définir 2 arguments: Offset & Limit. Celles-ci sont fondamentalement juste le SQL LIMIT
.
Si vous n'avez aucune utilité pour le plugin, désactivez-le, car il ne fera rien - sa sortie est attachée à un filtre…
$most_commented = apply_filters( 'wpse70027_display_comments', 0, 3 );
// Now process the result in your template...
… Qui peuvent simplement être placés dans n'importe quel fichier de modèle.
<?php
/**
* Plugin Name: (#70027) »kaiser« Get Most Commented.
* Description: Just place the filter in your themes template file and you're ready to go.
*/
function wpse70027_get_comments( $offset = 0, $limit = 10 )
{
global $wpdb;
static $instance;
// Validate input
$offset = absint( $offset );
$limit = absint( $limit );
// Prevent wrong user input
0 > $offset AND $instance['offset'] = 0;
// Setup offset/limit as 0/10 on the 1st run
! isset( $instance['offset'] ) AND $instance['offset'] = $offset;
! isset( $instance['limit'] ) AND $instance['limit'] = $limit;
// Setup the query string
! isset( $instance['query'] ) AND $instance['query'] =
"
SELECT $wpdb->posts.ID, $wpdb->posts.post_title,
COUNT($wpdb->comments.comment_post_ID) AS cmt
FROM $wpdb->posts, $wpdb->comments
WHERE comment_approved = '1'
AND $wpdb->posts.ID = $wpdb->comments.comment_post_ID
AND post_status = 'publish'
AND comment_status = 'open'
GROUP BY $wpdb->comments.comment_post_ID
ORDER BY cmt
DESC
LIMIT %d, %d
";
! isset( $instance['posts'] ) AND $instance['posts'] = array();
// Three conditions trigger a new query:
# A) Plugin is running the first time and 'posts' isn't set
# B) The input offset is below the default offset
# C) The input limit is above the default limit
if (
! isset( $instance['posts'] )
OR ! in_array( $offset, range( $instance['offset'], $instance['limit'] ) )
OR ! in_array( $limit, range( $instance['offset'], $instance['limit'] ) )
)
{
// Adjust the range
$instance['offset'] = $instance['offset'] > $offset ? $offset : $instance['offset'];
$instance['limit'] = $instance['limit'] < $limit ? $limit : $instance['limit'];
$instance['posts'] = $wpdb->get_results( $wpdb->prepare(
$instance['query']
,$instance['offset']
,$instance['limit']
) );
}
// Only return what was requested
return array_intersect_key(
$instance['posts']
,range( $offset, $limit )
);
}
add_filter( 'wpse70027_display_comments', 'wpse70027_get_comments', 10, 2 );
Et non, il n'y a aucune différence dans les performances lorsque vous le mettez dans votre fichier functions.php. La seule chose à faire est que ce code disparaîtra lors de la mise à jour ou du changement de thème, il est donc préférable de le laisser dans un plugin.
Vous pouvez utiliser la requête wordpress pour avoir plusieurs boucles dans une page et décaler le compte dans la deuxième boucle.
<?php
$args = array(
'posts_per_page' => 3,
'orderby' => 'comment_count'
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
//Put what you want to output here
<?php
endwhile;
endif; ?>
<?php wp_reset_postdata(); ?>
Ensuite, vous venez de compenser dans la deuxième requête.
<?php
$args = array(
'posts_per_page' => 3,
'orderby' => 'comment_count',
'offset' => 3
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
//Put what you want to output here
<?php
endwhile;
endif; ?>
http://codex.wordpress.org/Class_Reference/WP_Query#Post_.26_Page_Parameters