Comment réorganiser les champs dans comment_form ()

22

Im utilisant un filtre personnalisé pour changer les champs, mais je ne peux pas comprendre comment changer l' ordre des champs dans le formulaire de commentaire.

Ordre souhaité:

  • champ de commentaire (premier / haut)
  • prénom
  • email
  • site Internet

Voici le code que j'utilise actuellement:

function alter_comment_form_fields($fields){
    $fields['comments'] = 'Test';
    $fields['author'] = '<p class="comment-form-author">' . '<label for="author">' . __( 'Your name, please' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                    '<input id="author" name="author" type="text" placeholder="John Smith" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>';
    $fields['email'] = 'next';  //removes email field
    //$fields['url'] = '';  //removes website field

    return $fields;
}

add_filter('comment_form_default_fields','alter_comment_form_fields');
jrutter
la source

Réponses:

14

C'est assez simple. Il suffit de retirer les textareachamps par défaut - filtre 'comment_form_defaults'- et de l'imprimer sur l'action 'comment_form_top':

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Comment Textarea On Top
 * Description: Makes the textarea the first field of the comment form.
 * Version:     2012.04.30
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

// We use just one function for both jobs.
add_filter( 'comment_form_defaults', 't5_move_textarea' );
add_action( 'comment_form_top', 't5_move_textarea' );

/**
 * Take the textarea code out of the default fields and print it on top.
 *
 * @param  array $input Default fields if called as filter
 * @return string|void
 */
function t5_move_textarea( $input = array () )
{
    static $textarea = '';

    if ( 'comment_form_defaults' === current_filter() )
    {
        // Copy the field to our internal variable …
        $textarea = $input['comment_field'];
        // … and remove it from the defaults array.
        $input['comment_field'] = '';
        return $input;
    }

    print apply_filters( 'comment_form_field_comment', $textarea );
}
fuxia
la source
Bonne solution mais que faire si vous voulez changer l'ordre de 3 ou 4 champs?
Brad Dalton
1
@BradDalton La même chose: supprimez d'abord tout le contenu des champs, puis imprimez-les dans l'ordre souhaité comment_form_top.
fuxia
Je ne sais pas si le code a changé depuis, mais pour 4.0, il semble que comment_form_before_fieldsc'est mieux alorscomment_form_top
Mark Kaplun
@MarkKaplun De nos jours, je passerais la position souhaitée comme argument à une classe. :)
fuxia
4

J'ai aimé répondre toscho. Cependant, je voulais utiliser une zone de texte personnalisée, donc cela n'a pas fonctionné dans ce cas. J'ai utilisé les mêmes crochets mais avec des fonctions distinctes:

add_filter( 'comment_form_defaults', 'remove_textarea' );
add_action( 'comment_form_top', 'add_textarea' );

function remove_textarea($defaults)
{
    $defaults['comment_field'] = '';
    return $defaults;
}

function add_textarea()
{
    echo '<p class="comment-form-comment"><textarea id="comment" name="comment" cols="60" rows="6" placeholder="write your comment here..." aria-required="true"></textarea></p>';
}
mantish
la source
Notez que de nombreux plugins anti-spam modifient également la zone de texte. Cela doit être testé très bien - j'ai eu de sérieux problèmes avec une approche similaire.
fuxia
4

Il existe évidemment un certain nombre de façons d'y parvenir. Par exemple, pour déplacer le champ de commentaire au bas du formulaire, vous utiliseriez du code comme celui-ci:

add_filter( 'comment_form_fields', 'move_comment_field' );
function move_comment_field( $fields ) {
    $comment_field = $fields['comment'];
    unset( $fields['comment'] );
    $fields['comment'] = $comment_field;
    return $fields;
}

Si vous souhaitez réorganiser tous les champs, désactivez tous les champs. Remettez-les dans le tableau dans l'ordre dans lequel vous souhaitez les afficher. C'est simple, non?

J'ai pensé que je l'expliquerais explicitement pour que le prochain noobie comme moi trouve cette page et ne trouve pas les réponses utiles.

Josh C
la source
2

Le CSS exact pour cela dépendra de votre thème, cependant, voici une façon:

#commentform {
display:table;
width:100%;   
}

.comment-form-comment {
display: table-header-group; 
}

Les méthodes d'affichage de table vous permettent de réorganiser des objets de hauteur arbitraire.

Plus d'informations: http://tanalin.com/en/articles/css-block-order/

Otto
la source
1
Excellente idée Otto. Une approche similaire pourrait être accomplie en utilisant flexbox: <br> #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Bryan Willis
1

les champs du formulaire de commentaire sont dans le tableau $fieldsen fonction comment_form(). Vous pouvez accrocher à l'intérieur du filtre comment_form_default_fieldset réorganiser le tableau.

Vous pouvez également accrocher le filtre à l'intérieur comment_form_defaultset modifier les paramètres par défaut; laissez toutes les données dans le tableau et modifiez uniquement fieldle tableau avec vos champs personnalisés; inclure le html.

les champs par défaut si $:

      $fields =  array(
          'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                      '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
          'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                      '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
          'url'    => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
                      '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
      );
bueltge
la source