Felder in comment_form () neu anordnen

21

Ich benutze einen benutzerdefinierten Filter, um die Felder zu ändern, kann aber nicht herausfinden, wie die Reihenfolge der Felder im Kommentarformular geändert werden kann .

Gewünschte Bestellung:

  • Kommentarfeld (zuerst / oben)
  • Name
  • Email
  • Webseite

Dies ist der Code, den ich momentan benutze:

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

Antworten:

13

Das ist ziemlich einfach. Sie müssen nur textareadie Standardfelder herausnehmen - filtern 'comment_form_defaults'- und auf die Aktion drucken '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
 * Author:      Thomas Scholz <[email protected]>
 * Author URI:  http://toscho.de
 * 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 );
}
fuxia
quelle
Gute Lösung, aber was ist, wenn Sie die Reihenfolge von 3 oder 4 Feldern ändern möchten?
Brad Dalton
1
@BradDalton Dasselbe: Entfernen Sie zuerst alle Feldinhalte und drucken Sie sie dann in der gewünschten Reihenfolge aus comment_form_top.
Fuxia
Ich weiß nicht, ob sich der Code seitdem geändert hat, aber für 4.0 scheint comment_form_before_fieldses besser zu seincomment_form_top
Mark Kaplun
@ MarkKaplun Heutzutage würde ich die gewünschte Position als Argument an eine Klasse übergeben. :)
fuxia
4

Ich mochte es, zu antworten. Ich wollte jedoch ein benutzerdefiniertes Textfeld verwenden, sodass es in diesem Fall nicht funktionierte. Ich habe die gleichen Haken verwendet, aber mit separaten Funktionen:

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>';
}
Mantis
quelle
Beachten Sie, dass viele Anti-Spam-Plugins auch das Textfeld ändern. Dies muss sehr gut getestet werden - ich hatte ernsthafte Probleme mit einem ähnlichen Ansatz.
fuxia
4

Es gibt offensichtlich eine Reihe von Möglichkeiten, um dies zu erreichen. Um beispielsweise das Kommentarfeld an den unteren Rand des Formulars zu verschieben, verwenden Sie folgenden Code:

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

Wenn Sie alle Felder neu anordnen möchten, deaktivieren Sie alle Felder. Fügen Sie sie wieder in der Reihenfolge in das Array ein, in der sie angezeigt werden sollen. Einfach richtig?

Ich dachte mir, ich würde es ausdrücklich so formulieren, dass der nächste Neuling wie ich diese Seite findet und die Antworten nicht nützlich sind.

Josh C
quelle
2

Das genaue CSS hierfür hängt von Ihrem Thema ab. Hier ist jedoch eine Möglichkeit:

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

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

Mit den Methoden zur Tabellendarstellung können Sie Elemente beliebiger Höhe neu anordnen.

Weitere Informationen: http://tanalin.com/de/articles/css-block-order/

Otto
quelle
1
Tolle Idee Otto. Ein ähnlicher Ansatz könnte mit flexbox erreicht werden: <br> #commentform { display: flex; flex-flow: column; } .comment-form-comment { order: -1; }.
Bryan Willis
1

Die Felder der Kommentarform sind im Array $fieldsin Funktion comment_form(). Sie können den Filter einhängen comment_form_default_fieldsund das Array neu anordnen.

Sie können sich auch in den Filter einhängen comment_form_defaultsund die Standardeinstellungen ändern. Lassen Sie alle Daten im Array und ändern Sie nur die fielddes Arrays mit Ihren benutzerdefinierten Feldern. Fügen Sie das HTML hinzu.

die Standardeinstellung wenn $ Felder:

      $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>',
      );
bueltge
quelle