web-dev-qa-db-fra.com

Posts les plus commentés/populaires et offset

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

2
Andy M

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.

1
kaiser

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

0
chap