web-dev-qa-db-de.com

Comment Walker vs. Comment Callback

Ich habe diese Woche mit benutzerdefinierten Kommentaren rumgespielt und ich versuche herauszufinden, wann ich einen Walker verwenden möchte und wann ich einen Rückruf verwenden würde ...

Es gibt einige Dinge, die ich nicht genau herausfinden kann, wie ich mich ändern soll, aber die, die mich verrückt gemacht hat, ist das Hinzufügen von Klassen zum Kind-Tag <ul>:

<ul class="children">

Gibt es bestimmte Dinge, die ein Kommentarwanderer tun kann, die ein Kommentarrückruf nicht kann? ... oder umgekehrt? Und ist einer dieser "besseren" als Theme-Entwickler zu verwenden? Ich weiß zum Beispiel, dass viele Menü-Plugins nicht funktionieren, wenn ein Thema einen benutzerdefinierten Menü-Walker verwendet.

Wie auch immer, hier ist ein Beispiel für genau die gleichen Kommentare , aber einer wird über einen Walker ausgegeben und einer über einen Callback ... Was fehlt mir hier? Warum braucht man beides?

Kommentar Rückruf

wp_list_comments( array(
    'callback'      => 'bootstrap_comment_callback',
 ));

function bootstrap_comment_callback( $comment, $args, $depth ){
        $GLOBALS['comment'] = $comment; ?>
    <li id="comment-<?php comment_ID(); ?>" <?php comment_class( empty( $args['has_children'] ) ? '' : 'parent' ); ?>>

    <?php if ( 0 != $args['avatar_size'] ): ?>
    <div class="media-left">
        <a href="<?php echo get_comment_author_url(); ?>" class="media-object"><?php echo get_avatar( $comment, $args['avatar_size'] ); ?></a>
    </div>
    <?php endif; ?>

    <div class="media-body">
    <?php printf( '<h4 class="media-heading">%s</h4>', get_comment_author_link() ); ?>
    <div class="comment-metadata">
        <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID, $args ) ); ?>">
            <time datetime="<?php comment_time( 'c' ); ?>">
                <?php printf( _x( '%1$s at %2$s', '1: date, 2: time' ), get_comment_date(), get_comment_time() ); ?>
            </time>
        </a>
    </div><!-- .comment-metadata -->

    <?php if ( '0' == $comment->comment_approved ) : ?>
    <p class="comment-awaiting-moderation label label-info"><?php _e( 'Your comment is awaiting moderation.' ); ?></p>
    <?php endif; ?>             

    <div class="comment-content">
         <?php comment_text(); ?>
    </div>

    <ul class="list-inline">
        <?php edit_comment_link( __( 'Edit' ), '<li class="edit-link">', '</li>' ); ?>

    <?php
        comment_reply_link( array_merge( $args, array(
            'add_below' => 'div-comment',
            'depth'     => $depth,
            'max_depth' => $args['max_depth'],
            'before'    => '<li class="reply-link">',
            'after'     => '</li>'
        ) ) );  
    ?>
    </ul>
    </div>  
<?php
}

Kommentar Walker

wp_list_comments( array(
    'walker'        => new Bootstrap_Comment_Walker(),
 ));

class Bootstrap_Comment_Walker extends Walker_Comment {
    protected function html5_comment( $comment, $depth, $args ) {

?><li id="comment-<?php comment_ID(); ?>" <?php comment_class( empty( $args['has_children'] ) ? '' : 'parent' ); ?>>

    <?php if ( 0 != $args['avatar_size'] ): ?>
    <div class="media-left">
        <a href="<?php echo get_comment_author_url(); ?>" class="media-object"><?php echo get_avatar( $comment, $args['avatar_size'] ); ?></a>
    </div>
    <?php endif; ?>

    <div class="media-body">
    <?php printf( '<h4 class="media-heading">%s</h4>', get_comment_author_link() ); ?>
    <div class="comment-metadata">
        <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID, $args ) ); ?>">
            <time datetime="<?php comment_time( 'c' ); ?>">
                <?php printf( _x( '%1$s at %2$s', '1: date, 2: time' ), get_comment_date(), get_comment_time() ); ?>
            </time>
        </a>
    </div><!-- .comment-metadata -->

    <?php if ( '0' == $comment->comment_approved ) : ?>
    <p class="comment-awaiting-moderation label label-info"><?php _e( 'Your comment is awaiting moderation.' ); ?></p>
    <?php endif; ?>             

    <div class="comment-content">
         <?php comment_text(); ?>
    </div>

    <ul class="list-inline">
        <?php edit_comment_link( __( 'Edit' ), '<li class="edit-link">', '</li>' ); ?>

    <?php
        comment_reply_link( array_merge( $args, array(
            'add_below' => 'div-comment',
            'depth'     => $depth,
            'max_depth' => $args['max_depth'],
            'before'    => '<li class="reply-link">',
            'after'     => '</li>'
        ) ) );  
    ?>
    </ul>
    </div>      
<?php
    }   
}
5
Bryan Willis

Wir könnten umschreiben:

wp_list_comments( array(
    'callback'      => 'bootstrap_comment_callback',
 ));

mit dem Parameter null walker:

 wp_list_comments( array(
    'walker'        => null,
    'callback'      => 'bootstrap_comment_callback',
 ));

was bedeutet, dass wir die Standardklasse Walker_Comment verwenden:

  wp_list_comments( array(
    'walker'        => new Walker_Comment,
    'callback'      => 'bootstrap_comment_callback',
 ));

Die Methode Walker_Comment::start_el() ist nur ein Wrapper für eine der folgenden Methoden protected :

Walker_Comment::comment()
Walker_Comment::html5_comment()
Walker_Comment::ping()

dass, abhängig vom Kontext, jeder Kommentar an die Ausgabezeichenfolge angehängt wird, wenn Sie durch den Kommentarbaum gehen.

Durch die Verwendung einer benutzerdefinierten walker - Klasse, die die Klasse Walker_Comment erweitert, können wir die folgenden public - Methoden überschreiben:

Walker_Comment::start_el()
Walker_Comment::end_el()
Walker_Comment::start_lvl()
Walker_Comment::end_lvl()
Walker_Comment::display_element()

zusätzlich zu den oben genannten geschützten.

Wenn wir nur die Ausgabe der Methode start_el() ändern müssen, müssen wir nur den Parameter callback in wp_list_comments() verwenden.

3
birgire

In den einfachsten Erklärungen wird das Argument callback für wp_list_comments() verwendet, um auf eine Funktion zu verweisen, die den Anfang eines individual -Kommentars erstellt. (Das Argument end-callback verweist auf eine Funktion, die einen einzelnen Kommentar schließt.)

Sie können also Ihre eigene benutzerdefinierte Funktion verwenden, um einen einzelnen Kommentar auszugeben, während Sie weiterhin die Kernklasse Walker_Comment verwenden, um die gesamte Kommentarliste zu erstellen.

Umgekehrt können Sie auch Ihre eigene Klasse verwenden, um entweder die gesamte Walker_Comment -Klasse oder Teile davon zu überschreiben.

In Ihrem obigen Beispiel haben Sie eine benutzerdefinierte Walker-Klasse mit einer definierten Methode definiert: html5_comment(). Da Sie die Walker_Comment-Kernklasse erweitern, jedoch nur eine Methode (html_comment()) überschreiben, verwendet WP die restlichen in Walker_Comment definierten Methoden, um den Rest der Kommentarliste zu erstellen.

Verwenden Sie callback/end-callback, um einen einzelnen Kommentar zu erstellen, und verwenden Sie eine benutzerdefinierte Walker-Klasse, um die gesamte Kommentarliste zu erstellen. Sie brauchen nicht beides, es ist das eine oder andere.

Übrigens habe ich gerade einen Artikel geschrieben, der dies detaillierter beschreibt, basierend auf einem Plugin, das ich im Zusammenhang mit Bootstrap-Kommentaren für WordPress veröffentlicht habe. Sie finden es hier: http://darrinb.com/wp-bootstrap-comments/

1
darrinb