webentwicklung-frage-antwort-db.com.de

Warum startet comment_reply_link das Antwortformular an der falschen Stelle im Kommentarbereich?

Ich habe diese benutzerdefinierte extended Walker_Comments Klasse:

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

Was nach dem Rendern so angelegt ist:

 enter image description here 

Wenn ich auf die Schaltfläche "Antworten" klicke, möchte ich, dass mein Formular unter dem Kommentar angezeigt wird, mit dem es gestartet wurde. Stattdessen wird das Formular genau dort angezeigt, wo der Baum beginnt. (GIF-Bild):

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

Ich gehe davon aus, dass dies damit zusammenhängt, dass nicht die richtigen Parameter übergeben werden

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

Wie würde ich das erreichen?

3
Jonathan Guerin

Weil das in Javascript gemacht wird und Sie dieses Javascript in die Warteschlange stellen müssen, damit es funktioniert, wie in den Dokumenten angegeben:

Wenn JavaScript aktiviert ist und das JavaScript comment-reply.js geladen ist, verschiebt der Link das Kommentarformular direkt unter den Kommentar.

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

z.B.

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

Beachten Sie auch https://codex.wordpress.org/Migrating_Plugins_and_Themes_to_2.7/Enhanced_Comment_Display#Javascript_Comment_Functionality

Bearbeiten Ich vermute, dass das grundlegende Problem darin besteht, dass der Code nicht dasselbe Format verwendet und daher die erforderlichen IDs nicht vorhanden sind.

Beispielsweise verwendet die Kommentarantwort eine ID, um herauszufinden, unter welchen Kommentar das Antwortformular gestellt werden soll, aber Ihr HTML-Code enthält keine IDs. Siehe folgende Zeile in wp-includes/class-walker-comment.php:

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

In Ihrem Code ist keine Entsprechung vorhanden. Zumindest diese IDs müssen vorhanden sein:

  • kommentar-x
  • div-comment-x

Das letztere ist im ersteren verschachtelt, und x ist die ID dieses Kommentars.

Beachten Sie, dass Sie jederzeit in einer Testumgebung wie einer lokalen Entwicklungsumgebung zu einem der Standardthemen wechseln können, um den Standard-HTML-Code zu erhalten, oder indem Sie sich die Kommentar-Walker-Klasse in core unter wp-includes/class-walker-comment.php ansehen.

Als Referenz können Sie auch die hier definierte Formularbewegungsfunktion überschreiben:

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

Es wird dem Hauptobjekt window hinzugefügt, sodass Sie es durch Ihre eigene Kopie mit zusätzlicher Debugging-Ausgabe oder durch andere Mechanismen ersetzen können

1
Tom J Nowell