Comment_form () içindeki alanlar nasıl yeniden düzenlenir?


22

Alanları değiştirmek için özel bir filtre kullanıyorum, ancak yorum formundaki alanların sırasının nasıl değiştirileceğini çözemiyorum .

İstenilen sipariş:

  • yorum alanı (ilk / üst)
  • isim
  • E-posta
  • Web sitesi

Şu anda kullanıyorum kod budur:

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

Yanıtlar:


14

Bu oldukça basit. Sadece textareavarsayılan alanların dışına çıkmanız gerekiyor - filtre 'comment_form_defaults'- ve eyleme yazdırın '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 );
}

İyi bir çözüm ama peki 3 veya 4 alanın sırasını değiştirmek istiyorsanız?
Brad Dalton,

1
@BradDalton Aynı: önce tüm alan içeriklerini kaldırın, sonra bunları istediğiniz sırayla yazdırın comment_form_top.
fuxia

Kodun o zamandan beri değişip değişmediğini bilmiyorum ama 4.0 için sanki comment_form_before_fieldsdaha iyi bir kanca gibi görünüyorcomment_form_top
Mark Kaplun

@MarkKaplun Günümüzde, istenen pozisyonu bir sınıfa argüman olarak iletirdim. :)
fuxia

4

Cevap vermeyi çok severdim. Ancak özel bir textarea kullanmak istedim, bu yüzden bu durumda işe yaramadı. Aynı kancaları kullandım ama ayrı fonksiyonlara sahip oldum:

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

İstenmeyen posta önleme eklentilerinin çoğunun da textarea'yı değiştirdiğini unutmayın. Bunun çok iyi test edilmesi gerekiyor - Benzer bir yaklaşımla ciddi problemlerim vardı.
fuxia

4

Belli ki bunu başarmanın birkaç yolu vardır. Örneğin, yorum alanını formun altına taşımak için şöyle bir kod kullanın:

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

Tüm alanları yeniden düzenlemek istiyorsanız, tüm alanları kaldırın. Onları, görüntülenmelerini istediğiniz sırada diziye geri yerleştirin. Basit değil mi?

Benim gibi bir sonraki noobie'nin bu sayfayı bulmasını ve cevapları yararlı bulmamasını açıkça söyleyeceğimi düşündüm.


2

Bunu yapmak için tam CSS temanıza bağlı olacaktır, ancak, işte bir yol:

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

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

Tablo görüntüleme yöntemleri, keyfi yükseklikte olan şeyleri yeniden sıralamanıza izin verir.

Daha fazla bilgi: http://tanalin.com/tr/articles/css-block-order/


1
Harika fikir Otto. Bir benzer bir yaklaşım <br>: FlexBox kullanılarak gerçekleştirilebilir olabilir #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Bryan Willis

1

yorum formu od alanları $fieldsişlevdeki dizidedir comment_form(). Filtrenin içine asılabilir comment_form_default_fieldsve diziyi yeniden sıralayabilirsiniz .

Ayrıca filtrenin içini bağlayabilir comment_form_defaultsve varsayılanları değiştirebilirsiniz; tüm verileri dizide bırakın ve yalnızca fieldözel alanlarınızla dizinin değerini değiştirin ; html'yi ekleyin.

eğer varsayılan: $ 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>',
      );
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.