質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.93%

Wordpressのコメントを「いいね」の多い順に表示する方法

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 3,439

score 41

前提・実現したいこと

Wordpressにサイト作成を行っております。
現在表示している投稿の各ユーザーのコメントに、「WP Ulike」というプラグインにて「いいね」ボタンを実装しており、コメントの表示順についても「いいね」の数が多いものから並べ替えたいと思っています(デフォルトではコメント投稿日付順にてソート)。

発生している問題・エラーメッセージ

「いいね」数順にコメントを表示するために、Wordpressのsingle.phpファイルに以下のコードを追記しました。
しかし、この方法によると、既に「いいね」が1つ以上あるコメントについては表示されるものの、「いいね」が表示されていないコメントが表示されない状況が生じています。

該当のソースコード

以下のコードをsingle.phpファイルに記述しております。
(meta_keyの_commentlikedは、データベース「wp_commentmeta」に格納されているキーとなります)

<?php
    $args = array(
    'orderby' => 'meta_value_num',
    'order' => 'DESC',
    'post_id' => $post->ID,
    'meta_key' => '_commentliked',
);
    $comments = get_comments( $args );
    echo    '<ul class="comments-list">';
    echo    wp_list_comments( array( 'style'=>'ul' ), $comments );
    echo    '</ul>';
?>

試したこと

おそらく、「'meta_key' => '_commentliked',」によって、取得するコメントが'_commentliked'のメタキーを持つもの絞られてしまっているためかと考えております。

上記のコードを変更したり、「いいね」のついていないコメントを取得するためのコードを追記することで対応しようと考えましたが、解決策が見い出せない状況となっております。

補足情報(言語/FW/ツール等のバージョンなど)

phpのバージョン5.7、Wordpressは4.5となります。

プログラミングを勉強し始めて日が浅く、初歩的な質問となり大変恐縮ですが、どうぞよろしくお願い申し上げます。
その他、ご回答に必要な情報がありましたらお気軽にご連絡くださいませ。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+4

自分の勉強をかねて、「いいね」数順にコメントをソートするコードを書いてみました。
もっとうまく書く方法がありそうで、あまりきれいではないコードですが、
ひとまず用をなすようなので、投稿します。

テスト不十分なので、不具合があるかもしれません。
ご利用の場合は、各位の責任のもとで……ということでひとつよろしくお願いします。

// コメントを取得
$args = array(
    'post_id' => $post->ID,
);
$comments_query = new WP_Comment_Query();
$comments = $comments_query->query( $args );
$comment_count_array = array();

foreach($comments as $comment) {
    // メタフィールドから「いいね」数を取得
    $count = get_comment_meta( $comment->comment_ID, '_commentliked', true );
    $count = intval($count); // 文字列を数値に変換

    // 「いいね」数順にソートするため、配列にぶっこむ
    $comment_count_array[$comment->comment_ID]['count'] = $count;
    $comment_count_array[$comment->comment_ID]['object'] = $comment;
}

// 'count'キーで配列をソートする
foreach($comment_count_array as $key=>$value) {
    $counts[$key] = $value['count'];
}
array_multisort($counts, SORT_DESC, $comment_count_array);

// 'count'順にソートした配列からコメントオブジェクトを取り出す
$comments = array_column($comment_count_array, 'object');

// 出力
echo    '<ul class="comments-list">';
echo    wp_list_comments( array( 'style'=>'ul' ), $comments );
echo    '</ul>';

追記

SQL版です。こっちのほうがシンプルでよさそう……

$comments = $wpdb->get_results("
                    SELECT *
                    FROM
                        $wpdb->comments
                        LEFT JOIN
                            (SELECT * FROM $wpdb->commentmeta WHERE $wpdb->commentmeta.meta_key = '_commentliked') AS commentmeta
                            ON $wpdb->comments.comment_ID = commentmeta.comment_id
                    WHERE
                        comment_post_ID = $post->ID
                    ORDER BY
                        CAST(meta_value AS UNSIGNED) DESC
                ",
                OBJECT);

// 出力
echo    '<ul class="comments-list">';
echo    wp_list_comments( array( 'style'=>'ul' ), $comments );
echo    '</ul>';

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/07 22:38

    SQL版を利用してしばらくモニターしてみると、どうやら「いいね」の数が10個以上のコメントが上位表示されなくなってしまう現象に遭遇しました。

    バグの内容について調査していますが、いまいち原因がわかりません。
    どなたかお分かりになる方がいらっしゃれば、ご教示いただけますと幸いです。

    キャンセル

  • 2016/12/10 11:40 編集

    > SQL版を利用してしばらくモニターしてみると、どうやら「いいね」の数が10個以上のコメントが上位表示されなくなってしまう現象に遭遇しました。

    申し訳ありません、私がミスしていました。
    不具合はmeta_valueを文字列として比較してしまっていたためです。
    以下の通り、修正しましたので、ご確認ください。
    「meta_value」 →「CAST(meta_value AS UNSIGNED)」

    キャンセル

  • 2016/12/11 08:33

    mizさん

    コメントありがとうございます!
    上記のとおり修正し、問題なく表示されるようになりました。

    度重なるご回答大変ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る