Дополнительные поля в системе оценок Woocommerce

13 февр. 2014 г., 22:11:20
Просмотры: 13.4K
Голосов: 0

Мне нужно добавить дополнительные поля в систему оценок товаров 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&hellip;', '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-поля?

0
Все ответы на вопрос 1
3

Я работал над этим самостоятельно, имея очень небольшой опыт программирования.

На данный момент я обнаружил, что можно добавить еще одно значение, но для этого нужно обновить несколько файлов в шаблоне 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="">'.__( 'Оценить&hellip;', '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="">'.__( 'Оценить&hellip;', '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. Удачи!

17 мар. 2014 г. 09:20:47
Комментарии

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

Dan Dan
17 мар. 2014 г. 10:58:57

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

Justice_ Justice_
17 мар. 2014 г. 11:12:58

Думаю, мне, возможно, придется редактировать файл single-product.js

Justice_ Justice_
17 мар. 2014 г. 11:49:00