web-dev-qa-db-fra.com

Pourquoi comment_reply_link lance-t-il le formulaire de réponse au mauvais endroit de la section commentaire?

J'ai cette classe extended Walker_Comments personnalisée:

class Custom_Comment_Walker extends Walker_Comment {
    var $tree_type = 'comment';
    var $db_fields = array( 'parent' => 'comment_parent', 'id' => 'comment_ID' );

    function __construct() { ?>
        <ul class="comments-list col-md-12">

    <?php }

    function start_lvl( &$output, $depth = 0, $args = array() ) {
        $GLOBALS['comment_depth'] = $depth + 1;
        ?>

        <ul class="child-comments comments-list col-md-12">

    <?php }

    function end_lvl( &$output, $depth = 0, $args = array() ) {
        $GLOBALS['comment_depth'] = $depth + 1; ?>

        </ul>

    <?php }

    function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) {
        $depth++;
        $GLOBALS['comment_depth'] = $depth;
        $GLOBALS['comment'] = $comment;

        $tag = 'li';
        $add_below = 'comment';
        ?>

        <li <?php comment_class( $depth == '1' ? 'parent col-md-12' : 'child col-md-11') ?> id="comment-<?php comment_ID() ?>" itemprop="comment" itemscope itemtype="http://schema.org/Comment">
            <div class="comment-wrapper col-md-12">
                <?php echo get_avatar( $comment, 65, '[default gravatar URL]', 'Author’s gravatar' ); ?>
                <div class="info">
                    <div class="comment-meta" role="complementary">
                        <h2 class="comment-author">
                            <a class="comment-author-link" href="<?php comment_author_url(); ?>" itemprop="author"><?php comment_author(); ?></a>
                        </h2>
                        <time class="comment-time" datetime="<?php comment_date('Y-m-d') ?>T<?php comment_time('H:iP') ?>" itemprop="datePublished"><?php comment_date('jS F Y') ?>, <a href="#comment-<?php comment_ID() ?>" itemprop="url"><?php comment_time() ?></a></time>
                        <?php edit_comment_link('<p class="comment-meta-item">Edit this comment</p>','',''); ?>
                        <?php if ($comment->comment_approved == '0') : ?>
                        <p class="comment-time">Your comment is awaiting moderation.</p>
                        <?php endif; ?>
                    </div>
                    <div class="comment-content" itemprop="text">
                        <?php comment_text() ?>
                        <?php comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ) ?>
                    </div>
                </div>
            </div>

    <?php }

    function end_el(&$output, $comment, $depth = 0, $args = array() ) { ?>

        </li>

    <?php }

    function __destruct() { ?>

        </ul>

    <?php }
}

Ce qui est aménagé comme ça, après avoir rendu:

 enter image description here 

Lorsque je clique sur le bouton de réponse, j'aimerais que mon formulaire se place sous le commentaire qui l'a lancé. Au lieu de cela, le formulaire se place juste sous le début de l'arborescence, comme ceci (image gif):

https://i.imgur.com/QQij8a4.gifv

Je suppose que cela a à voir avec le fait de ne pas transmettre les paramètres corrects à

comment_reply_link( array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) )

Comment pourrais-je m'y prendre pour y parvenir?

3
Jonathan Guerin

Parce que c'est fait en javascript, et vous devez mettre en file d'attente ce javascript pour que cela fonctionne, comme indiqué dans la documentation:

Si JavaScript est activé et que le script comment-reply.js est chargé, le lien déplace le formulaire de commentaire juste en dessous du commentaire.

https://codex.wordpress.org/Function_Reference/comment_reply_link

par exemple.

function wpse289875_enqueue_comments_reply() {
    if ( is_singular() && get_option( 'thread_comments' ) ) {
        wp_enqueue_script( 'comment-reply' );
    }
}
add_action( 'comment_form_before', 'wpse289875_enqueue_comments_reply' );

Prenez également note de https://codex.wordpress.org/Migrating_Plugins_and_Themes_to_2.7/Enhanced_Comment_Display#Javascript_Comment_Functionality

Edit Je soupçonne que le problème fondamental est que le code n’utilise pas le même format et que les identifiants nécessaires ne sont pas présents.

Par exemple, la réponse au commentaire utilise un ID pour déterminer le commentaire sous lequel le formulaire de réponse doit être placé, mais votre code HTML ne comporte aucun ID. Voir cette ligne dans wp-includes/class-walker-comment.php:

<div id="div-comment-<?php comment_ID(); ?>" class="comment-body">

Aucun équivalent n'existe dans votre code. Au moins, ces identifiants doivent être présents à partir des apparences:

  • comment-x
  • div-comment-x

Ce dernier étant imbriqué dans le premier et x étant l'ID de ce commentaire.

Notez qu'à tout moment, vous pouvez passer à l'un des thèmes par défaut dans un environnement de test, tel qu'un env. Dev local, pour obtenir le code HTML de travail par défaut, ou en consultant la classe du promeneur de commentaires dans core à wp-includes/class-walker-comment.php

Pour référence, vous pouvez également remplacer la fonction moveform utilisée telle que définie ici:

https://github.com/WordPress/WordPress/blob/master/wp-includes/js/comment-reply.js#L213

Il est ajouté à l'objet window principal afin que vous puissiez le remplacer par votre propre copie par une sortie de débogage supplémentaire ou par des mécanismes différents.

1
Tom J Nowell