web-dev-qa-db-ja.com

改ページ付きのコメントを集約

添付されている投稿に関係なく、all commentsを表示するページを作成したいです。それは潜在的に10,000以上のコメントを持つことになるので、私はそのページをページ付けしたいと思います。


その方法がわからないが、ここで私がこれまでに研究した機能のいくつかを紹介する。

  1. get_comments - post_idが渡されなかった場合は、すべてのコメントが返されます。しかし、これらをページ分割する方法はありません(offsetnumberのオプションがありますが、手動で行うのは面倒ですvery)。

  2. wp_list_comments - これに関するドキュメントはかなり悪いですが、 ソースコードget_comments配列を2番目の引数として渡すことで、get_commentsと組み合わせて使用​​した場合、すべてのコメントをループ処理できることを示唆しています。しかし、これはまだ実際にはget_commentsを使用するでしょう…それでは、コメントを入手してください。そして、それをページ付けする方法はないようです。

  3. previous_comments_linknext_comments_link - これらはwp_list_commentsとの組み合わせでのみ動作するようです2番目の引数なしで).

  4. paginate_comments_links - wp_list_commentsでのみ機能するように見えます(2番目の引数なしで)。


私が試したこと:

  1. get_commentsnumber引数を使用するだけです。

    $comments = get_comments(array(
        'status'    => 'approve',
        'number'    => '2'
    ));
    
    wp_list_comments(array(
        'callback' => 'my_rendering_function'
    ), $comments);
    
    paginate_comments_links();
    

    これはページ付けリンクを表示しません。

  2. ここに提案された方法は: ページ付けでページに最新のコメントを表示します

    $comments = get_comments(array(
        'status' => 'approve'
    ));
    
    wp_list_comments('per_page=2', $comments);
    
    paginate_comments_links();
    

    どちらもうまくいきません(最初の2つのコメントは表示されますが、ページ区切りは表示されません)。また、私はget_commentsallのコメントをメモリにロードするのを嫌がっています。


質問:

allcommentsにページ区切りを付けるにはどうすればいいですか?


P.S。WordPress 3.4.1&PHP 5.3.2を使用しています。

6
MegaHit

たぶんあなたが逃した主なものはあなたが 設定ディスカッションサブパネル でチェックされた「ページにコメントを分割する」を持たなければならないということです。ページ付け機能では、URLの書き換えと同様に、これを設定する必要があります。

これが、あなたが求めていることをするための、完成したページテンプレートです。

<?php
/*
Template Name: All Comments
See http://wordpress.stackexchange.com/questions/63770/aggregate-comments-with-pagination
*/
get_header(); ?>

<div id="content" role="main">

    <?php
    # The comment functions use the query var 'cpage', so we'll ensure that's set
    $page = intval( get_query_var( 'cpage' ) );
    if ( 0 == $page ) {
        $page = 1;
        set_query_var( 'cpage', $page );
    }

    # We'll do 10 comments per page...
    # Note that the 'page_comments' option in /wp-admin/options-discussion.php must be checked
    $comments_per_page = 10;
    $comments = get_comments( array( 'status' => 'approve' ) );
    ?>
    <ol start="<?php echo $comments_per_page * $page - $comments_per_page + 1 ?>">
        <?php wp_list_comments( array (
            'style' => 'ol',
            'per_page' => $comments_per_page,
            'page' => $page,
            'reverse_top_level' => false
        ), $comments ); ?>
    </ol>

    <?php # Now you can either use paginate_comments_links ... ?>
    <?php paginate_comments_links() ?>

    <?php # Or you can next/prev yourself... ?>
    <?php if ( get_comment_pages_count( $comments, $comments_per_page ) > 1 ) : // are there comments to navigate through ?>
    <nav id="comment-nav">
        <div class="nav-previous"><?php previous_comments_link( __( '&larr; Newer Comments' ) ); ?></div>
        <div class="nav-next"><?php next_comments_link( __( 'Older Comments &rarr;' ) ); ?></div>
    </nav>
    <?php endif; ?>

</div><!-- #content -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

あなたがグローバルにコメントページネーションを有効にしたくないなら、それはまだ可能ですが、あなたは手動で書き換えルールを追加しなければならないので、それは小さな頭痛の種です。そうすれば、WordPressは簡単なフィルタでコメントのページ付けが可能になると考えるようになります。

add_filter( 'pre_option_page_comments', '__return_true' );
4
Matthew Boynes