Come riordinare i campi in comment_form()
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
- 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');

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

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

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

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

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:
- rimuovi tutti i campi
- 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.

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

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/

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

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>',
);
