วิธีจัดเรียงฟิลด์ใหม่ใน comment_form ()


22

ฉันใช้ตัวกรองที่กำหนดเองเพื่อเปลี่ยนฟิลด์ แต่ไม่สามารถหาวิธีเปลี่ยนลำดับของฟิลด์ในฟอร์มความคิดเห็นได้

คำสั่งที่ต้องการ:

  • ช่องแสดงความคิดเห็น (แรก / บนสุด)
  • ชื่อ
  • อีเมล
  • เว็บไซต์

นี่คือรหัสที่ฉันใช้ในปัจจุบัน:

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

คำตอบ:


14

นั่นง่ายมาก คุณเพียงแค่นำtextareaเอาฟิลด์เริ่มต้น - ตัวกรอง'comment_form_defaults'- และพิมพ์ลงบนแอ็คชัน'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 );
}

วิธีแก้ปัญหาที่ดี แต่ถ้าคุณต้องการเปลี่ยนลำดับของฟิลด์ 3 หรือ 4
แบรดดัลตัน

1
@BradDalton เดียวกัน: comment_form_topลบเนื้อหาข้อมูลทั้งหมดก่อนแล้วพิมพ์ไว้ในลำดับที่ต้องการใน
fuxia

ไม่ทราบว่ารหัสมีการเปลี่ยนแปลงตั้งแต่นั้นมาหรือไม่ แต่สำหรับ 4.0 ดูเหมือนว่าcomment_form_before_fieldsจะเป็นตะขอที่ดีขึ้นแล้วcomment_form_top
Mark Kaplun

@ MarkKaplun ทุกวันนี้ฉันจะผ่านตำแหน่งที่ต้องการเป็นอาร์กิวเมนต์ไปยังชั้นเรียน :)
fuxia

4

ฉันชอบที่จะตอบคำถาม อย่างไรก็ตามฉันต้องการใช้ textarea แบบกำหนดเองดังนั้นจึงไม่สามารถใช้งานได้ในกรณีนี้ ฉันใช้ hooks ตัวเดียวกัน แต่มีฟังก์ชั่นแยก:

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

โปรดทราบว่าปลั๊กอินต่อต้านสแปมจำนวนมากก็กำลังเปลี่ยนข้อความเช่นกัน สิ่งนี้จะต้องมีการทดสอบที่ดีมาก - ฉันมีปัญหาร้ายแรงด้วยวิธีการที่คล้ายกัน
fuxia

4

เห็นได้ชัดว่ามีหลายวิธีที่จะทำให้สิ่งนี้สำเร็จ ตัวอย่างเช่นหากต้องการย้ายเขตข้อมูลความคิดเห็นไปที่ด้านล่างของแบบฟอร์มคุณจะต้องใช้รหัสดังนี้:

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

หากคุณต้องการจัดเรียงฟิลด์ทั้งหมดใหม่ให้ยกเลิกการตั้งค่าฟิลด์ทั้งหมด วางกลับเข้าไปในอาร์เรย์ตามลำดับที่คุณต้องการให้แสดง ง่ายใช่มั้ย

ฉันคิดว่าฉันจะอธิบายอย่างชัดเจนสำหรับ noobie คนต่อไปเช่นฉันเพื่อค้นหาหน้านี้และไม่พบคำตอบที่เป็นประโยชน์


2

CSS ที่แน่นอนในการทำเช่นนี้จะขึ้นอยู่กับธีมของคุณอย่างไรก็ตามนี่เป็นวิธีหนึ่ง:

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

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

วิธีการแสดงตารางช่วยให้คุณสามารถจัดลำดับความสูงได้ตามต้องการ

ข้อมูลเพิ่มเติม: http://tanalin.com/en/articles/css-block-order/


1
ความคิดที่ดีอ็อตโต วิธีการที่คล้ายกันสามารถทำได้โดยใช้ #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }flexbox:
ไบรอันวิลลิส

1

ฟิลด์ od ฟอร์มความคิดเห็นอยู่ในแถวในการทำงาน$fields comment_form()คุณสามารถขอด้านในตัวกรองcomment_form_default_fieldsและจัดลำดับอาร์เรย์ใหม่ได้

นอกจากนี้คุณสามารถขอตัวกรองภายในcomment_form_defaultsและเปลี่ยนค่าเริ่มต้น; ปล่อยข้อมูลทั้งหมดไว้ในอาร์เรย์และเปลี่ยนเฉพาะfieldอาร์เรย์ด้วยฟิลด์ที่กำหนดเองของคุณ รวมถึง html

ค่าเริ่มต้นถ้าเขตข้อมูล $:

      $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>',
      );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.