web-dev-qa-db-ja.com

ページ付けとオーダーバイのカスタムWP_Comment_Query?

メタキーで並べるカスタム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の結果を返すことです。

何がおかしいのですか?

4
Swen

目標は、コメントをページ分割して、最初にcomment_ratingメタ値が最も高いコメントを表示することでした。

Cjbjの回答とMiloとbirgireによるコメントのおかげで、私はこの問題に対する直観的ではない解決策を見つけ出しました。

numberoffsetを使用することで、正しい順序で結果を作成することができましたが、ページ付けは奇妙であり、各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
4
Swen

wp_comment_query クラスを見てみると、パラメーターpagedがないことがわかります。次にページネーションを許可する wp_list_comments を見ると、コメントのページネーションを実現するために 長いwalker関数 が呼び出されることがわかります。

だから、それはあなたが自分でコメントのページ付けをしたい、あなたはいくつかの重要なプログラミング次第です。基礎はwp_comments_queryで利用可能なnumberoffsetパラメータです。 1ページに5つのコメントが必要な場合は、次のようなパラメータが必要になります。

page 1: offset=0, number=5
page 2: offset=5, number=5
page 2: offset=10, number=5

基本的に、あなたはあなたのページのquery_varからページを得て、それから望ましいオフセットを計算しなければならないでしょう。 max_num_pageswp_comment_queryパラメータもないことに注意してください、それであなたの選択の中にいくつのコメントがあるのか​​知るのは難しいでしょう。

毎回完全なコメントリストを取得して、クエリではなくPHPでページ付けを解決する方が簡単な場合があります。

2
cjbj