web-dev-qa-db-ja.com

ワードプレスでは、1ページあたりの最大ネストコメント数は無視されます

デフォルト設定(IIRC)は1ページあたり10コメント、最大ネスト数は5です。

問題(あるいは少なくともマイナーな煩わしさ)は、コメントへの返信が1ページあたりの最大数10までカウントされないことです。私はあなたがスレッドを中断したくないことを理解することができます、そしてそれは避けられるべきです、しかし私のテストケースでは私が持っています:

test10
- test10 2
- test10 3
- - test10 4
- - - test10 5
- - test10 6
- test10 7
- test10 8
- test10 9
test9
test8 (should be on a new page?)
test7
test6
test5
test4
test3
test2
test1

それらはすべて同じページに表示されます。しかし実際には私はtest9のコメントの後にそれを破りたいと思います。

私はそれが簡単になることはないだろう面白い感覚を持っています。うまくいけばテーマフレームワークの中にメソッドがあるでしょうが、必要であれば私はwordpressを修正することを恐れていません。

5
Mat

私はこれが実際に私にとっても非常に有益であると決心したので、私はプッシュしてカスタムウォーカーを書きました。 Walker_Paged_Threaded

私は自分の能力の及ぶ限りではコメントしようとしました、そして確かにそれは一緒に投げられる少しです、しかし、私は結果に満足です。

どうやって使うのですか

クラスは、コメントだけに限定しないように、元のWalkerと同じ抽象的なアプローチで書かれています。しかし、物事を単純にするために、という名前に変更します*;

Walker_Comment_Paged_Threaded extends Walker_Comment

今すぐあなたのテーマのcomments.phpに。

wp_list_comments( array( 'walker' => new Walker_Comment_Paged_Threaded ) );

わーい!スレッドを説明するページ付きコメント。

既知の副作用

ページの計算方法が変更されたため、get_comment_pages_count$per_pageのようなパラメータを渡すと、$threadedのような関数は異常な動作をし始めます。箱から出してすぐに、これは当てはまりません。

しかしget_comment_pages_countが空の場合、Walker_Comment$wp_query::max_num_comment_pagesにフォールバックします。ただし、最初にwp_list_commentsを呼び出すと、ウォーカーが実行され、プロパティが自動的に設定されます。

あなたがコメントページネーションやページリンクを表示している場合beforeあなたのコメント、あなたはそのようなことをする必要があるでしょう。

<?php

/**
 * Capture comments in an output buffer. The function needs to run before
 * displaying page links, as it runs the walker and then sets the
 * 'max_num_comment_pages' property on $wp_query.
 */
ob_start();

wp_list_comments( array( 'walker' => new Walker_Comment_Paged_Threaded ) );
$comments_list = ob_get_clean();

?>

<?php paginate_comments_links(); ?>

<?php echo $comments_list; ?>

これは実際にそれを回避するための最善の方法です、私を信頼してください!

あなたがそれを抽象的に保ちたいのであれば、各意図のための複数のコピーなしで、あなたは 少し醜い である '多重継承'を偽造することができます。

N.B.実際には回答なので、これを別の回答として追加することをお勧めします。

3
TheDeadMedic

最初は "nu-uh"のようでしたが、それから "oh yeah!"のようになりました。 ;)

素晴らしいことは、すべての「ページ付け」がPHPで行われることです。言い換えれば、それは単にforeachループとネストされた配列であり、SQLの制限とオフセットではありません。

本物の仕事の本質はWalker::paged_walk()(具体的にはメソッドの半分くらい)に固定できます。

基本的に、コメントをループ処理して、親によってそれらを積み重ね、次に表示する「トップレベル」セットのどのスライスを計算するかを計算します($page_numおよび$per_page引数に基づいて)。それから、それは単にこの「スライス」をループし、コメントの子もループします(もしあれば)。

できますし、しなければなりません!同じ論理を適用するのは良い考えですが、ネストされたコメントも入れてください。それが私かどうかは別の質問です!

しかし、私は今問題を明らかにし、ボールを転がし続けるためだけに、これを投稿することを考えていました。

N.B。他のメソッドWalker::get_number_of_root_elements()もあります。これは only get_comment_pages_count()によって使われます(少なくともコアでは)。 しかし、 this 関数は至る所で使われているので、メソッド名が意味するところにもかかわらず、新しいアルゴリズムに対応し、子供たちもカプセル化する必要があるでしょう。 。

2
TheDeadMedic

Wp-includes/comment-template.phpのWalker_Commentで遊んだ方がいいかもしれません。

1
maryisdead