Come riordinare i campi in comment_form()

29 apr 2012, 22:33:15
Visualizzazioni: 30.3K
Voti: 24

Sto usando un filtro personalizzato per modificare i campi, ma non riesco a capire come cambiare l'ordine dei campi nel modulo dei commenti.

Ordine desiderato:

  • campo commento (primo/in alto)
  • nome
  • email
  • sito web

Questo è il codice che sto utilizzando attualmente:

function alter_comment_form_fields($fields){
    $fields['comments'] = 'Test';
    $fields['author'] = '<p class="comment-form-author">' . '<label for="author">' . __( 'Inserisci il tuo nome' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                    '<input id="author" name="author" type="text" placeholder="Mario Rossi" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>';
    $fields['email'] = 'successivo';  // rimuove il campo email
    //$fields['url'] = '';  // rimuove il campo sito web

    return $fields;
}

add_filter('comment_form_default_fields','alter_comment_form_fields');
0
Tutte le risposte alla domanda 5
4
15

È abbastanza semplice. Devi solo rimuovere il textarea dai campi predefiniti – filtrando 'comment_form_defaults' – e stamparlo nell'azione 'comment_form_top':

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: T5 Comment Textarea On Top
 * Description: Rende il textarea il primo campo del modulo di commento.
 * Version:     2012.04.30
 * License:     MIT
 * License URI: http://www.opensource.org/licenses/mit-license.php
 */

// Usiamo una sola funzione per entrambi i compiti.
add_filter( 'comment_form_defaults', 't5_move_textarea' );
add_action( 'comment_form_top', 't5_move_textarea' );

/**
 * Prende il codice del textarea dai campi predefiniti e lo stampa in cima.
 *
 * @param  array $input Campi predefiniti se chiamato come filtro
 * @return string|void
 */
function t5_move_textarea( $input = array () )
{
    static $textarea = '';

    if ( 'comment_form_defaults' === current_filter() )
    {
        // Copia il campo nella nostra variabile interna ...
        $textarea = $input['comment_field'];
        // ... e rimuovilo dall'array dei predefiniti.
        $input['comment_field'] = '';
        return $input;
    }

    print apply_filters( 'comment_form_field_comment', $textarea );
}
30 apr 2012 01:32:24
Commenti

Buona soluzione, ma cosa succede se vuoi cambiare l'ordine di 3 o 4 campi?

Brad Dalton Brad Dalton
27 lug 2014 07:13:51

@BradDalton Lo stesso: rimuovi prima tutti i contenuti dei campi, poi stampali nell'ordine desiderato in comment_form_top.

fuxia fuxia
27 lug 2014 10:12:32

Non so se il codice sia cambiato da allora, ma per la 4.0 sembra che comment_form_before_fields sia un hook migliore rispetto a comment_form_top

Mark Kaplun Mark Kaplun
26 set 2014 17:53:43

@MarkKaplun Al giorno d'oggi passerei la posizione desiderata come argomento a una classe. :)

fuxia fuxia
26 set 2014 17:59:25
0

Ovviamente ci sono diversi modi per ottenere questo risultato. Ad esempio, per spostare il campo del commento in fondo al modulo, potresti utilizzare un codice come questo:

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

Se invece volessi riorganizzare tutti i campi:

  1. rimuovi tutti i campi
  2. reinserisci i campi nell'array ma nell'ordine in cui vuoi che vengano visualizzati

Semplice, vero? Ho pensato di spiegarlo esplicitamente per il prossimo principiante come me che potrebbe arrivare su questa pagina e non trovare risposte utili.

20 feb 2016 19:11:36
1

Mi è piaciuta la risposta di toscho. Tuttavia volevo utilizzare un textarea personalizzato, quindi in quel caso non funzionava. Ho usato gli stessi hook ma con funzioni separate:

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="scrivi qui il tuo commento..." aria-required="true"></textarea></p>';
}
23 ott 2012 17:38:20
Commenti

Tieni presente che molti plugin anti-spam modificano anche l'area di testo. Questo deve essere testato molto bene – ho avuto seri problemi con un approccio simile.

fuxia fuxia
23 ott 2012 18:29:52
1

Il CSS esatto per ottenere questo risultato dipenderà dal tuo tema, tuttavia ecco un modo per farlo:

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

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

I metodi di visualizzazione a tabella ti permettono di riordinare elementi di altezza arbitraria.

Maggiori informazioni: http://tanalin.com/en/articles/css-block-order/

30 apr 2012 02:40:37
Commenti

Ottima idea Otto. Un approccio simile potrebbe essere realizzato utilizzando flexbox: <br>#commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.

Bryan Willis Bryan Willis
3 dic 2015 14:28:53
0

i campi del modulo di commento sono contenuti nell'array $fields nella funzione comment_form(). Puoi agganciarti al filtro comment_form_default_fields e riordinare l'array.

Inoltre puoi agganciarti al filtro comment_form_defaults e modificare i valori predefiniti; mantieni tutti i dati nell'array e cambia solo il campo field dell'array con i tuoi campi personalizzati; includi l'html.

Il valore predefinito di $fields è:

      $fields =  array(
          'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Nome' ) . '</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">' . __( 'Sito web' ) . '</label>' .
                      '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
      );
30 apr 2012 01:29:23