Прошу помощи. У многих товаров не подсчитывается рейтинг. Есть решение

Доброго дня всем!

Нарисовалась проблема.
Раньше на сайте (магазин) не использовался рейтинг товаров, только отзывы. Со временем начали использовать рейтинг. Но большинство отзывов, естественно, остались с количеством звезд - 0. Решил подправить это дело и в БД (таблица product_reviews, вроде, называется) в поле rate заменил на многих товарах NULL на цифры (от 1 до 5) в зависимости от отзыва. По итогу на многих (но не всех) товарах рейтинг теперь не рассчитывается вообще. Звезды в отзывах проставляются, а общий рейтинг - "0". Структуру таблицы и т.п. не менял, только значение одного поля.

Вот пример отсутствия общего рейтинга: http://kosmetichka.com.ua/maska-dlja-ochischenija-...

Вот пример его присутствия, хотя поле rate тоже менялось: http://kosmetichka.com.ua/tush-dlja-resnic-pyshnye...

Прошу помощи победить это дело.

1 ответ

  • 4
    Леонид Вакуленко Webasyst 19 апреля 2016 07:48 # Решение

    Надо обновить shop_product.rating и shop_product.rating_count. Вот такой запрос их пересчитает:

    UPDATE shop_product AS p
        JOIN (
            SELECT product_id,
                SUM(rate) AS total_rating, COUNT(id) AS rating_count
            FROM `shop_product_reviews`
            WHERE review_id = 0
                AND rate IS NOT NULL
                AND status != 'deleted'
            GROUP BY product_id
        ) AS r ON p.id=r.product_id
    SET p.rating_count = r.rating_count,
        p.rating = r.total_rating / r.rating_count
    • +1
      Плебей Плебей 19 апреля 2016 07:57 #

      Спасибо Вам огромное, Леонид! Очень сильно помогли.

      Дабы не создавать отдельную тему, спрошу здесь. Рейтинг товаров показывается, скажем прямо, не совсем корректно - с жестким округлением. Т.е. при расчетном рейтинге в диапазоне от 4.1 до 4.9 итоговый рейтинг указывается 4 звезды, при расчетном от 3.1 до 3.9 указывается 3 звезды и т.д. При том, что в png-файле со звездочками, вроде, есть и половинки.
      Реально как-то исправить эту ситуацию?

      • +2

        Должен показывать с половинками. У меня 4.3 - это уже четыре с половиной звёздочки, а 4.8 - уже 5 полных. Как в вашей теме дизайна выводится этот рейтинг? Шаблон product.html. В стандартной теме default оно выглядит вот так:

                {if !empty($product.rating) && $product.rating > 0}
                    <span class="rating nowrap" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating" title="{sprintf('[`Average user rating: %s / 5`]', $product.rating)}">
                        {$wa->shop->ratingHtml($product.rating, 16)}
                        <span itemprop="ratingValue" style="display: none;">{$product.rating}</span>
                        <span itemprop="reviewCount" style="display: none;">{$reviews_total_count}</span>
                    </span>
                {/if}
        

        Часть, которая выводит звёздочки с половинками - это {$wa->shop->ratingHtml($product.rating, 16)}

        • +1
          Плебей Плебей 19 апреля 2016 08:57 #

          Фактически, так у меня и есть (плюс по schema.org доработки)

          ...
          
              <h2>
                  <span itemprop="name">{$product.name|escape}</span>
                  {if !empty($product.rating) && $product.rating > 0}
                      <span class="rating nowrap" itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating" title="{sprintf('[`Average user rating: %s / 5`]', $product.rating)}">
                      <meta itemprop="bestRating" content="5">
                      <meta itemprop="worstRating" content="1">
                          {$wa->shop->ratingHtml($product.rating, 16)}
                          <span itemprop="ratingValue" style="display: none;">{$product.rating}</span>
                          <span itemprop="reviewCount" style="display: none;">{$reviews_total_count}</span>
                      </span>
                  {else}
          
          ...

          Странно... Получается в стилях что-то накручено?

          • +1

            Если (для товара с рейтингом 4.3-4.7) в HTML'е на последней звёздочке есть класс star-half, то всё сгенерилось правильно, и надо копать в стилях. Если star-empty, то что-то не так с генерацией звёздочек.

    • +1

      Огромное спасибо!

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите