コメント

の記事

  • コメントの表示数を制限する

    singleページでのコメントの表示数について、
    ディスカッション設定によりコメントを複数ページに分割表示できるものの、singleページを表示するタイミングで取得するコメントは常にその記事に関するコメントすべてとなる。つまりコメントを5件づつ表示する場合でも、その投稿についてコメントが100件あれば100件を取得している。

    あるサイトのサーバー負荷が異様に重くて調べたところ、特定の記事についてコメントが10000件以上ついているためと分かった。この10000件とは決してスパムではなく、singleページがFLASHゲームで遊ぶ構成になっているため人気ゲームにコメントがたくさんついてしまったのだ。コメントは最新の50件を5件づつ分割表示している。必要なコメントは50件なので、できれば古くなったコメントを削除してしまいたかった。しかしサイト運営者からは過去のコメントを削除しないようにと要求されている。
    そうこうしているうちに、問題となるslow queryが浮かび上がった。
    SELECT wp_comments.* FROM wp_comments WHERE comment_post_ID = '99' AND comment_approved = '1' ORDER BY comment_date_gm

    このSQL文はwp-includes/comment-template.phpのcomments_template()という関数にあった。singleページを表示するさいにグローバル変数の$commentsにコメント配列をセットしている部分である。

    ここにLIMITを追加すればよいのだろうがコアコードは修正できない。フォーラムで質問したところ、query フックでlimit句を追加するアドバイスをいただいた。しかし、コメント取得のSQL文は3とおりがあり並び順が固定の場合もあるため、どうも思ったとおりにいかない。そうこうしているうちに、コメントの取得に件数が制限できないのはコメント階層を考慮してのことだと気付いた。単純にLIMITを付けるだけではダメなのだ。

    今回はコメント階層を使っていないということもあり、comments_template()をfunction.phpにリネームコピーしてカスタマイズすることで対処した。 ここのSQL文のORDERをDESCにして、LIMITを追加。さらにsingle.phpからcomments_template()を呼んでいる部分を、新しい関数名に変更した。

    問題のsingleページはなんとか軽くなったように思う。
    こんな対応でよいのかな?10000件もコメントがつくとは想定外だ。

  • コメントをスレッド対応

    バージョン2.7あたりからコメントがスレッド対応になっていたものの、使ったことがなかった。コメントのコールバック関数に以下を追加すると、コメントに対して「返信」のリンクが表示される。

    [PHP]
    comment_reply_link( array_merge( $args, array( ‘depth’ => $depth, ‘max_depth’ => $args[‘max_depth’] ) ) );
    [/PHP]

    $depthはコメント階層を示す値で、コールバック関数の第3パラメータに入ってくる。

    「返信」をクリックすると返信用のフォームが表示され、特定のコメントに対して返信することができる。表示する際にはCSSで<li>のネストに対応すればよい。以前から謎のひとつだった、コールバック関数の<li>を閉じてはいけない理由はここにあったのだ!

  • コメントフォーム

    commentテーマレビューで指摘があったように、3.0からコメントフォームは comment_form()で表示することになっている。single.phpなど表示したい箇所で呼べば、Twenty Ten テーマに似たものがデフォルトで表示される。
    カスタマイズしたい場合は、パラメータにオプションを指定する。このオプションがほとんどHTMLであるため、まわりくどい。翻訳コードを入れると再読も難しい。
    ハードコーディングをなくす方向というのはわかるものの、便利なのか不便なのかわからない。

  • 詳細ページでコメント表示をカスタマイズ

    コメント表示をカスタマイズするには、コメントの配列$commentを回して表示する。
    $commentはテーマのcomments.phpからのみ参照できる変数となっている。

    [sourcecode language=’php’]
    foreach ($comments as $comment) {
    custom_comments($comment, null, null);
    }
    [/sourcecode]

    WordPress 2.7よりコールバックを指定することができる。
    [sourcecode language=’php’]
    wp_list_comments(‘type=comment&callback=custom_comments’);
    [/sourcecode]

    関数custom_comments()はfunctions.phpに作成しておく。

    [sourcecode language=’php’]
    function toriko_custom_comments($comment, $args) {

    $GLOBALS[‘comment’] = $comment;

    ?>

    • さん

  • コメントフォームに項目を追加する

    アクションフックのcomment_formで、コメントフォームに項目を挿入することができる。
    以下はチェックボックスを追加する例。

    [sourcecode language=’php’]
    add_filter(‘comment_form’, ‘addMyControl’);

    function addMyControl() {
    _e(‘
    サンプル
    ‘);
    }
    [/sourcecode]

    ただし、テンプレート(comments.php)に以下の記述が必要である。
    [sourcecode language=’php’]
    ID); ?>
    [/sourcecode]
    デフォルトテーマにはこの記述がある。
    使用中のテーマにこの記述がない場合は、挿入したい箇所にこれを記述すればよい。

  • コメントにNGワードを設定する

    コメントにNGワードが含まれていたら承認待ちにすることができる。
    ダッシュボードの[設定]-[ディスカッション]メニューのコメントモデレーションにNGワードを指定する。
    IPアドレスを指定することもできる。