Cum să rearanjezi câmpurile în comment_form()

29 apr. 2012, 22:33:15
Vizualizări: 30.3K
Voturi: 24

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
  • email
  • 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');
0
Toate răspunsurile la întrebare 5
4
15

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 );
}
30 apr. 2012 01:32:24
Comentarii

Soluție bună, dar dacă vrei să schimbi ordinea a 3 sau 4 câmpuri?

Brad Dalton Brad Dalton
27 iul. 2014 07:13:51

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

fuxia fuxia
27 iul. 2014 10:12:32

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.

Mark Kaplun Mark Kaplun
26 sept. 2014 17:53:43

@MarkKaplun Astăzi aș pasa poziția dorită ca argument unei clase. :)

fuxia fuxia
26 sept. 2014 17:59:25
0

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:

  1. elimină toate câmpurile
  2. 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.

20 feb. 2016 19:11:36
1

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>';
}
23 oct. 2012 17:38:20
Comentarii

Rețineți că multe plugin-uri anti-spam modifică și ele elementul textarea. Acest lucru trebuie testat foarte bine – am avut probleme serioase cu o abordare similară.

fuxia fuxia
23 oct. 2012 18:29:52
1

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/

30 apr. 2012 02:40:37
Comentarii

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

Bryan Willis Bryan Willis
3 dec. 2015 14:28:53
0

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>',
      );
30 apr. 2012 01:29:23