メタキーで並べるカスタムWP_Comment_Query
を設定しようとしています。 (これらのコメントはAJAXで検索されていることを言及する価値があるかもしれません。)
クエリ引数にページ付けを追加するまで、すべてうまくいきます。
$orderby = 'top-comments';
$args = array(
'post_id' => $post_id,
'type' => 'comment',
'status' => 'approve',
'hierarchical' => true
);
if ( $orderby == 'top-comments' ) {
$args['meta_key'] = 'comment_rating';
$args['orderby'] = 'meta_value_num';
$args['order'] = 'ASC';
}
// $comments_query = new WP_Comment_Query;
// $comments = $comments_query->query($args);
// Works fine up until I add the pagination args
$number = 5;
$paged = 1;
$args['number'] = $number;
$args['paged'] = $paged;
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);
// Gets the 5 latest comments, then orders those by meta_key
ページネーション引数なしの結果は完璧に機能し、私が望むようにコメントを正確に並べます。
ただし、number引数が設定されると、最新の5つのコメントが取得され、それらがmeta_key => 'comment_rating'
の順に並べられます。
私が期待する振る舞いはWP_Comment_Query first orderbyを適用すること、そして then がトップ5の結果を返すことです。
何がおかしいのですか?
目標は、コメントをページ分割して、最初にcomment_rating
メタ値が最も高いコメントを表示することでした。
Cjbjの回答とMiloとbirgireによるコメントのおかげで、私はこの問題に対する直観的ではない解決策を見つけ出しました。
number
とoffset
を使用することで、正しい順序で結果を作成することができましたが、ページ付けは奇妙であり、各5つの投稿はすべてのページで「反転」しているようでした。
これが私の回避策であり、コメントのリストが表示されます。最初に最高の評価から、最後に最低の評価が付けられます。
$orderby = 'top-comments';
$args = array(
'post_id' => $post_id,
'type' => 'comment',
'status' => 'approve',
'hierarchical' => true
);
if ( $orderby == 'top-comments' ) {
$args['meta_key'] = 'comment_rating';
$args['orderby'] = 'meta_value_num';
$args['order'] = 'ASC';
}
// 5 Comments per page
$comments_per_page = $number = 5;
// Get the comment count to calculate the offset
$comment_count = wp_count_comments($post_id)->approved;
// Currently page 1 (set with AJAX in my case)
$page = 1;
// Rather unintuitively, we start with the total amount of comments and subtract
// from that number
// This is nessacary so that comments are displayed in the right order
// (highest rated at the top, lowest rated at the bottom)
// Calculate offset
$offset = $comments_count - ($comments_per_page * $page);
// Calculate offset for last page (to prevent comments being shown twice)
if ( $offset < 0 ) {
// Calculate remaining amount of comments (always less than 5)
$comments_last_page = $comments_count % $comments_per_page;
// New offset calculated from the amount of remaining comments
$offset = $offset + $comments_per_page - $comments_last_page;
// Set how many comments the last page shows
$number = $comments_last_page;
}
// Then we pass the $number and the $offset to our query args
$args['number'] = $number;
$args['offset'] = $offset;
$comments_query = new WP_Comment_Query;
$comments = $comments_query->query($args);
// Result: 5 comments, starting with the highest rating at the top, and the
// lowest rated at the bottom
wp_comment_query
クラスを見てみると、パラメーターpaged
がないことがわかります。次にページネーションを許可する wp_list_comments
を見ると、コメントのページネーションを実現するために 長いwalker関数 が呼び出されることがわかります。
だから、それはあなたが自分でコメントのページ付けをしたい、あなたはいくつかの重要なプログラミング次第です。基礎はwp_comments_query
で利用可能なnumber
とoffset
パラメータです。 1ページに5つのコメントが必要な場合は、次のようなパラメータが必要になります。
page 1: offset=0, number=5
page 2: offset=5, number=5
page 2: offset=10, number=5
基本的に、あなたはあなたのページのquery_var
からページを得て、それから望ましいオフセットを計算しなければならないでしょう。 max_num_pages
にwp_comment_query
パラメータもないことに注意してください、それであなたの選択の中にいくつのコメントがあるのか知るのは難しいでしょう。
毎回完全なコメントリストを取得して、クエリではなくPHPでページ付けを解決する方が簡単な場合があります。