Cum să rearanjezi câmpurile în comment_form()
Folosesc un filtru personalizat pentru a modifica câmpurile, dar nu reușesc să schimb ordinea câmpurilor în formularul de comentarii.
Ordinea dorită:
- câmpul pentru comentariu (primul/sus)
- nume
- website
Acesta este codul pe care îl folosesc în prezent:
function alter_comment_form_fields($fields){
$fields['comments'] = 'Test';
$fields['author'] = '<p class="comment-form-author">' . '<label for="author">' . __( 'Numele tău, te rog' ) . '</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'] = 'următorul'; // elimină câmpul de email
//$fields['url'] = ''; // elimină câmpul pentru website
return $fields;
}
add_filter('comment_form_default_fields','alter_comment_form_fields');

Este destul de simplu. Trebuie doar să scoți textarea
din câmpurile implicite – folosind filtrul 'comment_form_defaults'
– și să-l afișezi pe acțiunea 'comment_form_top'
:
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: T5 Comment Textarea On Top
* Description: Plasează textarea ca prim câmp în formularul de comentarii.
* Version: 2012.04.30
* License: MIT
* License URI: http://www.opensource.org/licenses/mit-license.php
*/
// Folosim o singură funcție pentru ambele scopuri.
add_filter( 'comment_form_defaults', 't5_move_textarea' );
add_action( 'comment_form_top', 't5_move_textarea' );
/**
* Scoate codul textarea din câmpurile implicite și îl afișează în partea de sus.
*
* @param array $input Câmpuri implicite dacă este apelată ca filtru
* @return string|void
*/
function t5_move_textarea( $input = array () )
{
static $textarea = '';
if ( 'comment_form_defaults' === current_filter() )
{
// Copiem câmpul în variabila noastră internă …
$textarea = $input['comment_field'];
// … și îl eliminăm din array-ul implicit.
$input['comment_field'] = '';
return $input;
}
print apply_filters( 'comment_form_field_comment', $textarea );
}

@BradDalton La fel: elimină mai întâi toate conținuturile câmpurilor, apoi afișează-le în ordinea dorită în comment_form_top
.

Nu știu dacă codul s-a schimbat de atunci, dar pentru versiunea 4.0 se pare că comment_form_before_fields
este un hook mai bun decât comment_form_top
.

Există evident mai multe modalități de a realiza acest lucru. De exemplu, pentru a muta câmpul de comentariu în partea de jos a formularului, ai putea folosi un cod precum acesta:
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;
}
Dacă ai vrea să rearanjezi toate câmpurile:
- elimină toate câmpurile
- adaugă câmpurile înapoi în array, dar în ordinea în care dorești să fie afișate
Simplu, nu? M-am gândit să explic totul explicit pentru următorul începător care va găsi această pagină și nu va găsi răspunsurile utile.

Mi-a plăcut răspunsul lui toscho. Totuși, am vrut să folosesc un câmp text personalizat, așa că soluția lui nu a funcționat în acest caz. Am folosit aceleași hook-uri dar cu funcții 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="scrieți comentariul aici..." aria-required="true"></textarea></p>';
}

CSS-ul exact pentru a face acest lucru va depinde de tema ta, dar iată o metodă:
#commentform {
display:table;
width:100%;
}
.comment-form-comment {
display: table-header-group;
}
Metodele de afișare tabelară îți permit să reordonezi elemente de înălțimi arbitrare.
Mai multe informații: http://tanalin.com/en/articles/css-block-order/

Excelentă idee, Otto. O abordare similară ar putea fi realizată folosind flexbox: <br>#commentform { display: flex; flex-flow: column; }
.comment-form-comment { order: -1; }
.

câmpurile formularului de comentarii sunt în array-ul $fields
din funcția comment_form()
. Puteți interveni folosind filtrul comment_form_default_fields
și reordona array-ul.
De asemenea, puteți utiliza filtrul comment_form_defaults
pentru a modifica valorile implicite; lăsați toate datele în array și schimbați doar field
din array cu câmpurile personalizate; includeți HTML-ul.
Valorile implicite pentru $fields sunt:
$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>',
);
