Campos adicionales en el sistema de valoraciones de Woocommerce

13 feb 2014, 22:11:20
Vistas: 13.4K
Votos: 0

Necesito agregar campos adicionales al sistema de valoraciones de productos en Woocommerce como este: Ejemplo de campos adicionales en valoraciones

Abri este archivo: /wp-content/plugins/woocommerce/templates/single-product-reviews.php y vi las siguientes líneas:

$comment_form = array(
        'title_reply' => $title_reply,
        'comment_notes_before' => '',
        'comment_notes_after' => '',
        'fields' => array(
            'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Nombre', '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' => __( 'Enviar valoración', 'woocommerce' ),
        'logged_in_as' => '',
        'comment_field' => ''
    );

y este

$comment_form['comment_field'] = '<p class="comment-form-rating"><label for="rating">' . __( 'Valoración', 'woocommerce' ) .'</label><select name="rating" id="rating">
            <option value="">'.__( 'Valorar&hellip;', 'woocommerce' ).'</option>
            <option value="5">'.__( 'Perfecto', 'woocommerce' ).'</option>
            <option value="4">'.__( 'Bueno', 'woocommerce' ).'</option>
            <option value="3">'.__( 'Normal', 'woocommerce' ).'</option>
            <option value="2">'.__( 'No tan malo', 'woocommerce' ).'</option>
            <option value="1">'.__( 'Muy pobre', 'woocommerce' ).'</option>
        </select></p>';

¿Hay alguna manera de agregar otros campos de selección?

0
Todas las respuestas a la pregunta 1
3

He estado trabajando en esto por mi cuenta con muy poca experiencia en programación.

Hasta ahora he descubierto que puedes añadir otro valor pero necesitas actualizar algunos archivos en la plantilla de WooCommerce. En el archivo single-product-reviews.php, simplemente repite el código desde <p> hasta </p>. Observa donde he añadido la selección de estrellas newrating:

if ( get_option('woocommerce_enable_review_rating') == 'yes' ) {

    $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>

Añade el nuevo código debajo:

        <p class="comment-form-rating"><label for="newrating">' . __( 'New Rating', 'woocommerce' ) .'</label><select name="newrating" id="newrating">
        <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>;

Después de guardar esto, deberías poder ver el nuevo campo de estrellas, o posiblemente un cuadro de selección desplegable ya que no hemos definido newrating como un estilo CSS en ningún lugar. Puedes hacer esto si lo deseas. El campo de valoraciones aparece en el formulario, pero no hará nada todavía hasta que configures el nuevo comments_meta en la base de datos.

Ahora creemos el nuevo comment_meta para almacenar estos datos para el campo NewRating, que estaría dentro del archivo /wp-content/plugins/woocommerce/includes/class-wc-comments.php. Encuentra este código:

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 );
    }

y repítelo debajo:

   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 );
    }
}

La función add_comment_meta crea el campo en la tabla comments_meta de WordPress y lo vincula a los IDs del comentario y del post. Así que ahora has almacenado un segundo valor de valoración en la base de datos.

El siguiente paso sería mostrar la segunda valoración cuando se muestren las reseñas. Esto se hace modificando el archivo: /single-product/review.php Añade una línea cerca de la parte superior donde veas $rating, que básicamente es copiar y pegar:

$newrating = intval( get_comment_meta( $comment->comment_ID, 'newrating', true ) );

Y luego, después de ver la declaración if alrededor de la línea 26, copia y pega todo este código y cambia la variable a 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(__( 'Rated %d out of 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( 'out of 5', 'woocommerce' ); ?></span>
            </div>
            <?php endif; ?>

Esta última sección de código imprimirá el newrating si existe.

Todavía estoy experimentando con la idea de tener una línea de unas 10 categorías de reseñas y luego calcular el promedio de estas para crear la valoración general. Solo he llegado hasta aquí hasta ahora.

Ten en cuenta que todo esto se borraría si actualizas el plugin de WooCommerce, así que usa plantillas cuando puedas. Si supiera cómo, haría esto como un plugin, pero solo soy un principiante en WP. Saludos.

17 mar 2014 09:20:47
Comentarios

Logré conseguir lo que necesitaba creando un plugin personalizado de sistema de valoración. De todas formas, gracias por tu respuesta, puede que me ayude más adelante.

Dan Dan
17 mar 2014 10:58:57

¿Podrías compartir tu respuesta también? Estoy teniendo problemas para cambiar los estilos y que se muestren las estrellas, solo logro que aparezca el cuadro de selección tipo dropdown.

Justice_ Justice_
17 mar 2014 11:12:58

Creo que tal vez tenga que editar el archivo single-product.js

Justice_ Justice_
17 mar 2014 11:49:00