Дополнительные поля в системе оценок Woocommerce
Мне нужно добавить дополнительные поля в систему оценок товаров WooCommerce, как показано на изображении:
Я открыл этот файл: /wp-content/plugins/woocommerce/templates/single-product-reviews.php и увидел следующие строки:
$comment_form = array(
'title_reply' => $title_reply,
'comment_notes_before' => '',
'comment_notes_after' => '',
'fields' => array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name', 'woocommerce' ) . '</label> ' . '<span class="required">*</span>' .
'<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30" aria-required="true" /></p>',
'email' => '<p class="comment-form-email"><label for="email">' . __( 'Email', 'woocommerce' ) . '</label> ' . '<span class="required">*</span>' .
'<input id="email" name="email" type="text" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30" aria-required="true" /></p>',
),
'label_submit' => __( 'Submit Review', 'woocommerce' ),
'logged_in_as' => '',
'comment_field' => ''
);
и этот код:
$comment_form['comment_field'] = '<p class="comment-form-rating"><label for="rating">' . __( 'Rating', 'woocommerce' ) .'</label><select name="rating" id="rating">
<option value="">'.__( 'Rate…', 'woocommerce' ).'</option>
<option value="5">'.__( 'Perfect', 'woocommerce' ).'</option>
<option value="4">'.__( 'Good', 'woocommerce' ).'</option>
<option value="3">'.__( 'Average', 'woocommerce' ).'</option>
<option value="2">'.__( 'Not that bad', 'woocommerce' ).'</option>
<option value="1">'.__( 'Very Poor', 'woocommerce' ).'</option>
</select></p>';
Есть ли способ добавить дополнительные select-поля?

Я работал над этим самостоятельно, имея очень небольшой опыт программирования.
На данный момент я обнаружил, что можно добавить еще одно значение, но для этого нужно обновить несколько файлов в шаблоне WooCommerce. В файле single-product-reviews.php
просто повторите код от <p>
до </p>
. Обратите внимание, где я добавил выбор звезд для newrating
:
if ( get_option('woocommerce_enable_review_rating') == 'yes' ) {
$comment_form['comment_field'] = '<p class="comment-form-rating"><label for="rating">' . __( 'Рейтинг', 'woocommerce' ) .'</label><select name="rating" id="rating">
<option value="">'.__( 'Оценить…', 'woocommerce' ).'</option>
<option value="5">'.__( 'Отлично', 'woocommerce' ).'</option>
<option value="4">'.__( 'Хорошо', 'woocommerce' ).'</option>
<option value="3">'.__( 'Средне', 'woocommerce' ).'</option>
<option value="2">'.__( 'Не так плохо', 'woocommerce' ).'</option>
<option value="1">'.__( 'Очень плохо', 'woocommerce' ).'</option>
</select></p>
Добавьте новый код ниже:
<p class="comment-form-rating"><label for="newrating">' . __( 'Новый рейтинг', 'woocommerce' ) .'</label><select name="newrating" id="newrating">
<option value="">'.__( 'Оценить…', 'woocommerce' ).'</option>
<option value="5">'.__( 'Отлично', 'woocommerce' ).'</option>
<option value="4">'.__( 'Хорошо', 'woocommerce' ).'</option>
<option value="3">'.__( 'Средне', 'woocommerce' ).'</option>
<option value="2">'.__( 'Не так плохо', 'woocommerce' ).'</option>
<option value="1">'.__( 'Очень плохо', 'woocommerce' ).'</option>
</select></p>;
После сохранения вы должны увидеть новое поле для звезд или, возможно, выпадающий список, так как мы не определили стиль CSS для newrating
. Вы можете сделать это, если хотите. Поле рейтинга появляется в форме, но оно пока ничего не делает, пока вы не установите new comments_meta
в базе данных.
Теперь создадим новый comment_meta
для хранения данных этого поля NewRating
, который будет находиться в файле /wp-content/plugins/woocommerce/includes/class-wc-comments.php
. Найдите этот код:
public function add_comment_rating( $comment_id ) {
if ( isset( $_POST['rating'] ) ) {
if ( ! $_POST['rating'] || $_POST['rating'] > 5 || $_POST['rating'] < 0 )
return;
add_comment_meta( $comment_id, 'rating', (int) esc_attr( $_POST['rating'] ), true );
$this->clear_transients( $comment_id );
}
и повторите его ниже:
if ( isset( $_POST['newrating'] ) ) {
if ( ! $_POST['newrating'] || $_POST['newrating'] > 5 || $_POST['newrating'] < 0 )
return;
add_comment_meta( $comment_id, 'newrating', (int) esc_attr( $_POST['newrating'] ), true );
$this->clear_transients( $comment_id );
}
}
Функция add_comment_meta
создает поле в таблице comments_meta
WordPress и связывает его с ID комментария и поста. Теперь у вас есть второе значение рейтинга в базе данных.
Следующий шаг — отображение второго рейтинга при показе отзывов. Это делается путем изменения файла:
/single-product/review.php
Добавьте строку в начале, где вы видите $rating
, что по сути является копированием и вставкой:
$newrating = intval( get_comment_meta( $comment->comment_ID, 'newrating', true ) );
А затем после оператора if на строке 26 скопируйте и вставьте весь этот код, изменив переменную на newrating
:
<?php if ( $newrating && get_option( 'woocommerce_enable_review_rating' ) == 'yes' ) : ?>
<div itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" class="star-rating" title="<?php echo sprintf(__( 'Оценка %d из 5', 'woocommerce' ), $newrating) ?>">
<span style="width:<?php echo ( intval( get_comment_meta( $GLOBALS['comment']->comment_ID, 'newrating', true ) ) / 5 ) * 100; ?>%"><strong itemprop="ratingValue"><?php echo intval( get_comment_meta( $GLOBALS['comment']->comment_ID, 'newrating', true ) ); ?></strong><?php _e( 'из 5', 'woocommerce' ); ?></span>
</div>
<?php endif; ?>
Этот последний раздел кода выведет newrating
, если он существует.
Я все еще экспериментирую с попыткой создать строку из 10 или около того категорий отзывов, а затем вычислить их среднее значение для создания общего рейтинга. Пока что я дошел только до этого.
Имейте в виду, что все это будет удалено при обновлении плагина WooCommerce, поэтому по возможности используйте шаблоны. Если бы я знал как, я бы сделал это плагином, но я только начинаю работать с WordPress. Удачи!

Мне удалось добиться нужного результата, создав собственный плагин системы рейтинга. В любом случае, спасибо за ваш ответ, возможно, он поможет мне в будущем.

Не могли бы вы тоже поделиться своим решением? У меня возникают сложности с изменением стилей для отображения звезд, пока получается только выпадающий список для выбора.
