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 필드의 순서를 변경하려면 어떻게해야합니까?
Brad Dalton

1
@BradDalton 동일 : 모든 필드 내용을 먼저 제거한 다음에 원하는 순서대로 인쇄하십시오 comment_form_top.
fuxia

코드는 그 이후로 변경했다 알고 있지만 4.0은 같은 것 같습니다하지 마십시오 comment_form_before_fields더 좋은 훅입니다comment_form_top
마크 Kaplun

@MarkKaplun 요즘 저는 원하는 위치를 클래스의 인수로 전달합니다. :)
fuxia

4

나는 toscho answer를 좋아했다. 그러나 사용자 정의 텍스트 영역을 사용하고 싶었으므로 그 경우 작동하지 않았습니다. 동일한 후크를 사용했지만 별도의 기능을 사용했습니다.

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
좋은 생각 오토. 유사한 접근 로 <br> : 인 flexbox를 사용하여 수행 할 수 있습니다 #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Bryan Willis

1

od 주석 형식의 필드 $fields는 함수 배열 에 있습니다 comment_form(). 당신은 필터 내부에 연결할 수 comment_form_default_fields순서를 배열합니다.

또한 필터 내부에 연결 comment_form_defaults하여 기본값을 변경할 수 있습니다 . 모든 데이터를 배열로 유지하고 field사용자 정의 필드로 배열의 데이터 만 변경 하십시오. html을 포함하십시오.

$ fields 인 경우 기본값 :

      $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.