web-dev-qa-db-ja.com

[返信]ボタンをクリックしたときにフロントエンドのコメントIDを取得する方法

replytocomパラメータのURLを解析して、そこからコメントIDを取得できるかもしれません。しかし、それは私のプラグインがこのパラメータを削除することができる他のプラグインと完全に互換性がないことを意味するでしょう(最も顕著に Yoast SEO )。それに、ちょっとハッキーな感じがします。別の方法はありますか?

Endgoal:AJAXリクエストで使用するコメントIDが必要です。フロントエンドでカスタムデータを表示できるように、データ(コメントスレッドの深さなど)を取得します。

2
woodduck

ここにいくつかのアイデアがあります:

  • comment_reply_link フィルタを介してカスタムのHTMLまたはデータ属性を挿入することは可能ですが、控えめにしておくほうが良いと思います。

  • 返信コメントフォームからコメントの親の値を取得しようとすることができます。

    <input type='hidden' name='comment_parent' id='comment_parent' value='0' />
    

    対応する値で更新された後.

  • 別のアプローチは、コメントリストのHTML内のIDをスキャンすることです。

    Walker_Comment::html5_comment()によって生成されます。

    <li id="comment-34" class="comment even thread-even depth-1">
        <article id="div-comment-34" class="comment-body">
        ... cut...
    

    Walker_Comment::comment()によって生成されます。

    <li class="comment even thread-even depth-1 parent" id="comment-34">
        <div id="div-comment-34" class="comment-body">
        ... cut...
    

    例えば、両方の場合を検索しますが、ユーザーがカスタム出力でこれらを上書きすることは可能です。

    こちらのdepth情報にも注意してください。

  • replytoリンクのonclick属性を解析しようとすることができます。

    onclick='return addComment.moveForm( "div-comment-34", "34", "respond", "123" )'
    
0
birgire

これは私の birgire の最後の提案です(onclickをパースするため):

jQuery(document).on( 'click', 'a.comment-reply-link', function( event ) {

// THIS PART GETS THE COMMENT ID
var hayStack = jQuery(this).attr('onclick');
var strawA = '"div-comment-';
var strawB = '"';
var tipNeedle = hayStack.lastIndexOf(strawA)+strawA.length;
var hayTruss = hayStack.substring(tipNeedle);
var endNeedle = hayTruss.indexOf(strawB); 
var needle = hayTruss.substring(0, endNeedle);
alert(needle);

// optional: THIS PART LOOKS UP THE PARENT ID (php side not shown)
var datatopost = {
        action: 'my_ajax_hook',
        nonce: ajaxobject.nonce,
        selected_comment_id: needle,
    };
jQuery.ajax({
    type: 'post',
    dataType: 'json',
    url: ajaxobject.ajaxurl,
    data: datatopost,
    error: function() { // Ajax request has failed
        jQuery('#comment').val('An error has occurred');
    },
    success: function (response) { // Ajax request has succeeded
        if (response.success) {
            // JSON successfully received
            alert(response.data.selected_comment_parent);
        }
    }
}); 
});
1
woodduck