WooCommerce: Display some reviews randomly on home page

守給你的承諾、 提交于 2021-01-24 11:26:32

问题


I want to have 5 random reviews appear on my home page each time someone visits.

I found some code to fetch all the reviews:

//add get product reviews to homepage

function get_woo_reviews()
{
    $count = 0;
    $html_r = "";
    $title="";
    $args = array(
        'post_type' => 'product'
    );

    $comments_query = new WP_Comment_Query;
    $comments = $comments_query->query( $args );

    foreach($comments as $comment) :
        $title = ''.get_the_title( $comment->comment_post_ID ).'';
        $html_r = $html_r. "" .$title."";
        $html_r = $html_r. "" .$comment->comment_content."";
        $html_r = $html_r."Posted By".$comment->comment_author." On ".$comment->comment_date. "";
    endforeach;

    return $html_r;
}

add_shortcode('woo_reviews', 'get_woo_reviews');

And it works just fine when I add the short code [woo_reviews] to this test page.

How do I change this to get only 5 random reviews?

Also How would I format this page now to make it only 5 reviews and be able to change the appearance of the reviews on the page (spacing, font etc)?


回答1:


With the comment WP_Comment_Query, comments can't be in random order. so you need to use a simple lightweight SQL query instead, using dedicated WordPressWPDB Class.

In the following code, you can change the styles and the html structure to get the desired output. You can also set the number of reviews you want to display in random order using available shortcode argument "limit" (default is set to 5):

add_shortcode('woo_reviews', 'get_random_woo_reviews');

function get_random_woo_reviews( $atts ){
    // Shortcode Attributes
    $atts = shortcode_atts( array(
        'limit' => '5', // <== Set to 5 reviews by default
    ), $atts, 'woo_reviews' );

    global $wpdb;

    // The SQL random query on product reviews
    $comments = $wpdb->get_results( $wpdb->prepare("
        SELECT *
        FROM  {$wpdb->prefix}comments c
        INNER JOIN {$wpdb->prefix}posts p ON c.comment_post_ID = p.ID
        WHERE c.comment_type = 'review' AND p.post_status = 'publish'
        ORDER BY RAND() LIMIT %d
    ", intval( esc_attr($atts['limit']) ) ) );

    ob_start(); // Start buffering

    ## CSS applied styles
    ?>
    <style>
        ul.product-reviews, ul.product-reviews li { list-style: none; margin:0; padding:0; line-height: normal;}
        ul.product-reviews li { display:block; max-width: 200px, padding: 10px; display:inline-block; vertical-align: text-top;}
        ul.product-reviews li .title {font-size: 1.2em;}
        ul.product-reviews li .content {max-width: 180px; font-size: 0.9em; margin-bottom: 6px;}
        ul.product-reviews li .author, ul.product-reviews li .date  {display: block; font-size: 0.75em;}
    </style>
    <?php

    ## HTML structure
    ?>
    <ul class="product-reviews"><?php

    foreach ( $comments as $comment ) {
        ?>
        <li>
            <h4 class="title"><?php echo get_the_title( $comment->comment_post_ID ); ?></h4>
            <div class="content"><?php echo $comment->comment_content; ?></div>
            <span class="author"><?php printf( __("Posted By %s") . ' ', '<strong>' . $comment->comment_author . '</strong>' ); ?></span>
            <span class="date"><?php printf( __("On %s"), '<strong>' . date_i18n( 'l jS \of F Y', strtotime( $comment->comment_date) ) . '</strong>' ); ?></span>

        </li>
        <?php
    }
    ?></ul><?php

    return ob_get_clean(); // Return the buffered output
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

USAGE: [woo_reviews] or in php: echo do_shortcode( "[woo_reviews]" );




回答2:


Add the follows code snippets -

function get_woo_reviews()
{
    $comments = get_comments(
        array(
            'status'      => 'approve',
            'post_status' => 'publish',
            'post_type'   => 'product',
        )
    ); 
    shuffle($comments);
    $comments = array_slice( $comments, 0, 5 );
    $html = '<ul>';
    foreach( $comments as $comment ) :
        $html .= '<li><h2>'.get_the_title( $comment->comment_post_ID ).'</h2>';
        $html .= '<p>' .$comment->comment_content.'</p>';
        $html .= "<p>Posted By :".$comment->comment_author." On ".$comment->comment_date. "</p></li>";
    endforeach;
    $html .= '</ul>';
    ob_start();
    echo $html;
        $html = ob_get_contents();
    ob_end_clean();

    return $html;
}
add_shortcode('woo_reviews', 'get_woo_reviews');


来源:https://stackoverflow.com/questions/57923643/woocommerce-display-some-reviews-randomly-on-home-page

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!