web-dev-qa-db-fra.com

Commentaire Walker vs. Commentaire Callback

Je plaisante avec les commentaires personnalisés cette semaine et j'essaie de comprendre quand je veux utiliser un déambulateur et quand utiliser un rappel ...

Il y a certaines choses que je n'arrive pas à comprendre comment changer, mais celle qui m'a rendu fou est comment ajouter des classes à la balise <ul> de l'enfant:

<ul class="children">

Y a-t-il certaines choses qu'un marcheur de commentaires peut faire qu'un callback de commentaire ne peut pas? ... ou vice-versa? Et l’un de ces "meilleurs" est-il à utiliser en tant que développeur de thèmes? Par exemple, je sais que beaucoup de plugins de menu ne fonctionnent pas lorsqu'un thème utilise un menu personnalisé.

Quoi qu'il en soit, voici un exemple de exactement les mêmes commentaires , mais l'un est émis à l'aide d'un trotteur et l'autre à l'aide d'un rappel ... Qu'est-ce qui me manque ici? Pourquoi ce besoin de tous les deux?

Commentaire de rappel

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
}

Commentaire 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

Nous pourrions réécrire:

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

avec le paramètre null walker:

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

ce qui signifie que nous utilisons la classe Walker_Comment par défaut:

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

La méthode Walker_Comment::start_el() est juste un wrapper pour l’une de ces méthodes protected :

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

que, selon le contexte, ajoute chaque commentaire à la chaîne de sortie lors de la navigation dans l’arborescence de commentaires.

L'utilisation d'un custom walker class, qui étend la classe Walker_Comment, nous permet de remplacer ces méthodes public :

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

en plus des protégés ci-dessus.

Si nous devons seulement modifier la sortie de la méthode start_el(), nous n’aurons besoin que d’utiliser le paramètre callback dans wp_list_comments().

3
birgire

Dans la plus simple des explications, l'argument callback de wp_list_comments() est utilisé pour référencer une fonction qui construira le début d'un individual comment. (L'argument end-callback fait référence à une fonction qui fermera un commentaire individuel.)

Vous pouvez donc utiliser votre propre fonction personnalisée pour générer un commentaire individuel tout en utilisant la classe de base Walker_Comment pour construire la liste whole comment.

Inversement, vous pouvez également utiliser votre propre classe pour remplacer tout ou partie de la classe de base Walker_Comment.

Dans votre exemple ci-dessus, vous avez défini une classe de programme personnalisé avec une méthode: html5_comment(). Étant donné que vous étendez la classe de base Walker_Comment, mais que vous ne substituez qu'une méthode (html_comment()), WP utilisera le reste des méthodes définies dans Walker_Comment pour générer le reste de la liste de commentaires.

Essentiellement, utilisez callback/end-callback pour générer un commentaire individuel, et une classe Walker personnalisée pour générer la liste de commentaires complète. Vous n'avez pas besoin des deux, c'est l'un ou l'autre.

Incidemment, je viens d'écrire un article décrivant cela plus en détail, basé sur un plugin que j'ai publié concernant les commentaires Bootstrap pour WordPress. Vous pouvez le trouver ici: http://darrinb.com/wp-bootstrap-comments/

1
darrinb