Получите среднюю оценку отзывов о товаре в пользовательском репортаже WooCommerce. - PullRequest
2 голосов
/ 11 апреля 2019

В Woocommerce я пытаюсь отобразить отчет (таблицу HTML) для каждого продукта в следующем виде:

enter image description here

На основе " Показать общее количество отзывов и оценок клиентов в WooCommerce " код ответа, который позволяет получить средний рейтинг продукта следующим образом:

echo products_rating_average_html();

Как получить средний рейтинг длякаждый продукт индивидуально ... например, если у продукта есть 4 или 5 отзывов, он получает средний рейтинг для них (для каждого продукта)

Я также хотел бы получить отзыв для каждого продукта, чтобы поместить их в таблицуа также ...

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Просмотрите эту ветку ответов , где вы увидите, что вы можете использовать WC_Product методы, такие как:

  • get_average_rating()
  • get_rating_counts()

Вот полный пример:

1) Получите необходимые данные о продуктах (настраиваемые):

$products_data = []; // Initializing

$products = wc_get_products( ['limit' => -1] ); // Get all WC_Product objects

// Loop through products -- Preparing data to be displayed
foreach ( $products as $product ) {
    $product_id = $product->get_id();

    // 1. Product data as product name …
    $products_data[$product_id]['name'] = $product->get_name();


    // 2. Average rating and rating count
    $products_data[$product_id]['rating'] = (float) $product->get_average_rating();
    $products_data[$product_id]['count']  = (int) $product->get_rating_count();

    // 3. Reviews -- Loop though product reviews
    foreach( get_approved_comments( $product_id ) as $review ) {
        if( $review->comment_type === 'review' ) {
            $products_data[$product_id]['reviews'][] = (object) [
                'author'    => $review->comment_author,
                'email'     => $review->comment_author_email,
                'date'      => strtotime($review->comment_date),
                'content'   => $review->comment_content,
            ];
        }
    }
}

2) Настраиваемый дисплейв таблице:

echo '<table class="products-reviews-ratings"><tr>
    <th>'.__("ID").'</th>
    <th>'.__("Name").'</th>
    <th>'.__("Rating").'</th>
    <th>'.__("count").'</th>
    <th style="text-align:center">'.__("Reviews (author, date and content)").'</th>
</tr>';

foreach ($products_data as $product_id => $data){
    echo '<tr>
        <td>'.$product_id.'</td>
        <td>'.$data['name'].'</td>
        <td>'.$data['rating'].'</td>
        <td>'.$data['count'].'</td>
        <td style="text-align:center">';

    if( isset($data['reviews']) && $data['reviews'] > 0 ) {
        echo '<table>';

        // Loop through reviews
        foreach ($data['reviews'] as $review ){
            echo '<tr>
                <td><a href="mailto:'.$review->email.'">'.$review->author.'</a></td>
                <td>'.date( 'Y-m-d', $review->date ).'</td>
                <td>'.$review->content.'</td>
            </tr>';
        }
        echo '</table>';
    } else {
        _e('No reviews yet');
    }

    echo '</td></tr>';
}
echo '</table>';

Вы получите что-то вроде:

enter image description here

1 голос
/ 11 апреля 2019

Это даст средний рейтинг данного идентификатора продукта

$rating = get_post_meta( $product_id, '_wc_average_rating', true );

Вы можете использовать это в цикле продукта, это даст вам приблизительное число среднего рейтинга без каких-либо HTML

Для получения последнего комментария вы можете использовать ниже, добавить этот код в functions.php, а затем вызвать это действие, где вы хотите, чтобы последний комментарий передавал текущий объект продукта в качестве аргумента

function display_product_review($product_id) {

    $product = wc_get_product( $product_id );
    $comments = get_approved_comments( $product->id );

    $product_link = '/product/' . $product->post->post_name . "/#tab-reviews/";

    if ( !empty ($comments) ) {
        echo $comments[0]->comment_content . '<br><a href="'. $product_link . '">Read more reviews...</a>';
    } else {
        echo "There are no reviews for this product yet. Would you like to <a href='" . $product_link ."'>add your own review</a>?";       
    }
}

add_action('get_latest_review','display_product_review');

Призыв к действию

do_action('get_latest_review',$product);
...