Как вывести счетчик отзывов о товаре с разных языков Polylang?
Добрый день, товарищи специалисты
Захотелось мне видеть на странице архивов товара кол-во отзывов.
Пришаманил в woocommerce > templates > loop > rating.php следующий код:
<?php /** * Loop Rating * * This template can be overridden by copying it to yourtheme/woocommerce/loop/rating.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://woo.com/document/template-structure/ * @package WooCommerceTemplates * @version 3.6.0 if ( ! defined( 'ABSPATH' ) ) { exit; } global $product; if ( ! wc_review_ratings_enabled() ) { return; } echo wc_get_rating_html( $product->get_average_rating() ); // WordPress.XSS.EscapeOutput.OutputNotEscaped. */ if ( ! defined( 'ABSPATH' ) ) { exit; } global $product; if ( ! wc_review_ratings_enabled() ) { return; } $count_answered = 0; if( class_exists( 'CR_Qna' ) ) { $count_answered = CR_Qna::get_count_answered( $product->get_id() ); } $rating_count = $product->get_rating_count(); $review_count = $product->get_review_count(); $average = $product->get_average_rating(); echo '<span class="review-rating">'; echo wc_get_rating_html( $average, $rating_count ); // WordPress.XSS.EscapeOutput.OutputNotEscaped. if( 0 < $rating_count ) { printf( _n( '%s review', '%s reviews', $review_count, 'customer-reviews-woocommerce' ), '<span class="count1">' . esc_html( $review_count ) . '</span>' ); } echo '</span>'; |
<?php /** * Loop Rating * * This template can be overridden by copying it to yourtheme/woocommerce/loop/rating.php. * * HOWEVER, on occasion WooCommerce will need to update template files and you * (the theme developer) will need to copy the new files to your theme to * maintain compatibility. We try to do this as little as possible, but it does * happen. When this occurs the version of the template file will be bumped and * the readme will list any important changes. * * @see https://woo.com/document/template-structure/ * @package WooCommerceTemplates * @version 3.6.0 if ( ! defined( 'ABSPATH' ) ) { exit; } global $product; if ( ! wc_review_ratings_enabled() ) { return; } echo wc_get_rating_html( $product->get_average_rating() ); // WordPress.XSS.EscapeOutput.OutputNotEscaped. */ if ( ! defined( 'ABSPATH' ) ) { exit; } global $product; if ( ! wc_review_ratings_enabled() ) { return; } $count_answered = 0; if( class_exists( 'CR_Qna' ) ) { $count_answered = CR_Qna::get_count_answered( $product->get_id() ); } $rating_count = $product->get_rating_count(); $review_count = $product->get_review_count(); $average = $product->get_average_rating(); echo '<span class="review-rating">'; echo wc_get_rating_html( $average, $rating_count ); // WordPress.XSS.EscapeOutput.OutputNotEscaped. if( 0 < $rating_count ) { printf( _n( '%s review', '%s reviews', $review_count, 'customer-reviews-woocommerce' ), '<span class="count1">' . esc_html( $review_count ) . '</span>' ); } echo '</span>';
В результате счетчик то я получил, только выводит он количество отзывов о товаре на активном языке сайта. Хотелось бы что бы он выводил сумму отзывов о товаре всех языковых версий.
Буду рад любым подсказкам
Дополнительно:
можно попробовать с помощью id из $product и pll_get_post_translations($post_id) получить список всех версий страницы. Если сработает, то потом их в цикле перебрать и с помощью какой-нибудь из функций wc создавать объект product из этих id страниц. Потом дублировать $product->get_rating_count() и тд, только сохранять общую сумма где-то вне цикла, чтобы потом уже с общими числами работать при выводе
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В Polylang у товара и его перевода обычно разные post ID, поэтому WooCommerce считает отзывы отдельно для каждой языковой версии. Если Вы хотите в архиве товара показывать общий счётчик отзывов по всем переводам, нужно получить ID всех переводов текущего товара и сложить количество комментариев/отзывов для них.
Сам шаблон
woocommerce/loop/rating.phpлучше не перегружать тяжёлой логикой. Вынесите подсчёт в функцию:function wt_get_polylang_product_reviews_count($product_id) { if (!function_exists('pll_get_post_translations')) { return get_comments_number($product_id); } $translations = pll_get_post_translations($product_id); $ids = array_map('absint', array_values($translations)); if (!$ids) { $ids = [$product_id]; } return (int) get_comments([ 'post__in' => $ids, 'status' => 'approve', 'type' => 'review', 'count' => true, ]); }
В шаблоне архива:
global $product; $count = wt_get_polylang_product_reviews_count($product->get_id()); if ($count > 0) { echo '<span class="product-reviews-count">' . esc_html($count) . ' отзывов</span>'; }
С рейтингом сложнее: среднюю оценку тоже нужно пересчитывать по всем отзывам переводов, иначе получится общий счётчик, но звёзды останутся только для текущего языка. Если это важно, получите approved reviews по всем ID, сложите meta
ratingи посчитайте среднее.Не выводите данные без экранирования. В счётчике используйте
esc_html(), а если добавляете HTML-разметку, собирайте её сами, не подставляя сырые значения из базы. Также учтите производительность: на большом каталоге такой подсчёт в каждом товаре может быть тяжёлым. Тогда лучше кешировать результат в transient или пересчитывать при добавлении нового отзыва.