Cara mengatur ulang bidang di comment_form ()


22

Saya menggunakan filter khusus untuk mengubah bidang, tetapi tidak dapat menemukan cara mengubah urutan bidang dalam formulir komentar.

Pesanan yang diinginkan:

  • bidang komentar (pertama / atas)
  • nama
  • e-mail
  • situs web

Ini adalah kode yang saya gunakan saat ini:

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

Jawaban:


14

Sederhana saja. Anda hanya perlu mengeluarkan textareabidang default - filter 'comment_form_defaults'- dan cetak pada tindakan '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 );
}

Solusi yang bagus tetapi bagaimana jika Anda ingin mengubah urutan 3 atau 4 bidang?
Brad Dalton

1
@BradDalton Hal yang sama: hapus semua isi isian terlebih dahulu, lalu cetak sesuai urutan yang diinginkan comment_form_top.
fuxia

Tidak tahu apakah kode telah berubah sejak saat itu tetapi untuk 4.0 sepertinya comment_form_before_fieldslebih baik mengaitkancomment_form_top
Mark Kaplun

@ MarkKaplun Saat ini saya akan memberikan posisi yang diinginkan sebagai argumen ke kelas. :)
fuxia

4

Saya suka juga menjawab. Namun saya ingin menggunakan textarea khusus, jadi itu tidak berfungsi dalam kasus itu. Saya menggunakan kait yang sama tetapi dengan fungsi yang terpisah:

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

Perhatikan bahwa banyak plugin anti-spam juga mengubah textarea. Ini harus diuji dengan sangat baik - Saya punya masalah serius dengan pendekatan yang sama.
fuxia

4

Jelas ada sejumlah cara untuk mencapai ini. Misalnya, untuk memindahkan bidang komentar ke bagian bawah formulir, Anda akan menggunakan kode seperti ini:

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

Jika Anda ingin mengatur ulang semua bidang, hapus semua bidang. Masukkan kembali ke dalam array sesuai urutan yang Anda inginkan. Sederhana bukan?

Saya pikir saya akan menjabarkannya secara eksplisit untuk noobie berikutnya seperti saya untuk menemukan halaman ini dan tidak menemukan jawaban yang bermanfaat.


2

CSS yang tepat untuk melakukan ini akan tergantung pada tema Anda, namun demikian, inilah salah satu caranya:

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

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

Metode tampilan tabel memungkinkan Anda menyusun ulang hal-hal dengan ketinggian sewenang-wenang.

Info lebih lanjut: http://tanalin.com/en/articles/css-block-order/


1
Ide bagus Otto. Sebuah pendekatan yang sama dapat dicapai dengan menggunakan flexbox: <br> #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Bryan Willis

1

bidang od formulir komentar berada di array $fieldsdalam fungsi comment_form(). Anda dapat mengaitkan di dalam filter comment_form_default_fieldsdan menyusun ulang array.

Anda juga dapat menghubungkan filter di dalam comment_form_defaultsdan mengubah default; biarkan semua data dalam array dan ubah hanya fieldarray dengan bidang khusus Anda; termasuk html.

default jika $ bidang:

      $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>',
      );
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.