WordPress 3.0 で「Commented entry list」プラグインが正常に動作しない不具合の対処
WordPress 3.0 で「Commented entry list」プラグイン(commented-entry-list.php)が正常に動作しない不具合が発生しており、本エントリーで対象方法を紹介します。「freezing-point」のNIMITZさんよりコメントで情報頂きました。ありがとうございました。
このプラグインは当ブログで配布しているWordPressテーマでも利用しているので、不具合が発生している場合は以下の対処を行ってください。
なお、
1.問題点
2010年6月時点で配布されている「Hirobee’s Trail」さんの「Commented entry list」プラグインを、WordPress 3.0に適用すると、コメントが投稿されていても「No Response.」という表示になります(下)。プラグインバージョンが1.2の場合は何も表示されません。

2.対処方法
commented-entry-list.phpを任意のエディタで開き、以下のように修正します。赤色部分を削除して青色部分を追加してください。
11行目あたり
…前略…
function get_recently_commented($limit = 10) {
global $wpdb, $tablecomments, $tableposts;
global $wpdb;
$tablecomments = $wpdb->comments;
$tableposts = $wpdb->posts;
…後略…
51行目あたり
…前略…
function get_recently_trackbacked($limit = 10) {
global $wpdb, $tablecomments, $tableposts;
global $wpdb;
$tablecomments = $wpdb->comments;
$tableposts = $wpdb->posts;
…後略…
修正後は次のように正常に表示されるようになります。

補足ですが、プラグインで利用している$tablecomments、$tablepostsという変数はWordPress 3.0では使用されなくなったので、修正後のように値を設定することで利用できるようになります。
3.参考サイト
修正方法を掲載されているサイトは以下です。ありがとうございました。
2010.06.27
配布元のリンクを、最新バージョンが配布されているページに変更しました。
コメントとトラックバックを分けて表示する for WordPress(改)
WordPress のデフォルト状態は、投稿情報や個別記事でのコメントとトラックバック(およびピンバック)が別々に表示されない仕様になっています。
個別記事では次のようにトラックバックとコメントが混在して表示されます。
変更前

それを踏まえて、以前「コメントとトラックバックを分けて表示する for WordPress(その1)」をエントリーしました。
これにより、次のようにコメントとトラックバックを分けて表示できるようになります。
変更後

また、メインページ等の投稿情報もコメントとトラックバックを分割表示できます。
変更後

以前紹介したカスタマイズでは「トラックバックが表示されません」とのご質問を頂きましたので、本エントリーで改修した内容を改めて紹介致します。
1.プラグインのダウンロード
下記のサイトよりの「Download」にある Trackping Separator. をクリックし、移動先のページ右側にある赤い「Download」をクリックして、プラグインアーカイブをダウンロードします。

2.プラグインのアップロード・有効化
ダウンロードしたアーカイブを展開し、中にある trackpings.php を /wp-content/plugins 配下にアップロードします。その後、WordPress の管理画面の「プラグイン」に移動し、Trackping Separator が表示されているので、「使用する」のリンクをクリックし、有効化します。

3.テンプレートの修正
WordPress 管理画面の「外観」→「編集」で、以下の各テンプレートを修正します。
3.1 メインインデックス/アーカイブ/検索結果/単一記事の投稿
インデックス/アーカイブ/検索結果/単一記事の投稿の各テンプレートに投稿者情報(投稿時間・カテゴリー等)がある場合は、 comments_popup_link で検索し、
<?php comments_popup_link('No Comments', '1 Comment', '% Comments'); ?>
というタグを見つけ、下記の内容に変更します。変更前のタグの内容はご利用のテンプレートによって若干異なりますのでご注意ください。
<?php comments_popup_link('Comments (0)', 'Comments (1)', 'Comments (%)'); ?> | <a href="<?php the_permalink() ?>#trackback" title="Trackback" class="trackacklink">Trackbacks (<?php echo trackpings('count'); ?>)</a>
個別記事ページにはコメント本文とトラックバック本文が表示されるので、当サイトでの配布テンプレートのように投稿者情報を本文下に表示している場合は、投稿者情報からコメント・トラックバックの表示自体を削除しても良いかもしれません。
3.2 コメント
ここでは当サイトで配布しているテンプレートを元に解説します。変更する箇所はコメント一覧を表示する部分だけなので、他のテンプレートをご利用の場合も適用可能と思います。
コメントテンプレートの下記の赤色部分を削除し、削除した部分に、その下にある「入れ替える内容(1)」または「入れ替える内容(2)」の内容を貼り付けてしてください。
(1)はトラックバックの表示部分に Trackping Separator プラグインで用意された関数 listtrackpings を利用したものです。(2)は listtrackpings を使わず、PHPを書き下してトラックバック部分を表示しています。表示内容は(2)の方がきめ細かく制御でき、編集用のリンクも表示できますが、構造が複雑です。PHPが書ける方は(2)を選択して自分好みの表示にしてください。
本項のテンプレート編集方法が分からない場合は、4項に進んでください。
<?php // Do not delete these lines
if ('comments.php' == basename($_SERVER['SCRIPT_FILENAME']))
die ('Please do not load this page directly. Thanks!');
if (!empty($post->post_password)) { // if there's a password
if ($_COOKIE['wp-postpass_' . COOKIEHASH] != $post->post_password) { // and it doesn't match the cookie
?>
<p class="nocomments">This post is password protected. Enter the password to view comments.<p>
<?php return;
}
}
?>
<div id="comments">
<?php if ('open' == $post->ping_status) : // comment close ?>
<h3 class="comments-head">Trackback URL</h3>
<input type="text" value="<?php trackback_url(true); ?>" size="60" readonly="readonly" id="trackbackurl" tabindex="1" accesskey="t" onfocus="this.select()" />
<?php endif; ?>
<h3 class="comments-head">Comment & Trackback<!-- [<?php comments_number('No Responses', 'One Response', '% Responses' );?>]--></h3>
<?php if (!('open' == $post->comment_status) && ('open' == $post->ping_status)) : // comment close ?>
<p class="nocomments">Comments are closed.</p>
<?php elseif (('open' == $post->comment_status) && !('open' == $post->ping_status)) : // trackback close ?>
<p class="nocomments">Trackback are closed.</p>
<?php elseif (!('open' == $post->comment_status) && !('open' == $post->ping_status)) : // comment and trackback close ?>
<p class="nocomments">Comments and Trackback are closed.</p>
<?php endif; ?>
<?php if ($comments) : ?>
<div class="commentlist">
<?php foreach ($comments as $comment) : ?>
<div id="comment-<?php comment_ID() ?>" class="comment">
<?php if ($comment->comment_approved == '0') : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
<div class="comment-content"><?php comment_text() ?></div>
<p class="comment-footer">Posted at <a href="#comment-<?php comment_ID() ?>"><?php comment_date('Y.m.j') ?> <?php comment_time() ?></a> by <?php comment_author_link() ?><?php if ( $user_ID ) : ?> | <?php edit_comment_link('edit','',''); ?><?php endif; ?></p>
</div>
<?php endforeach; /* end for each comment */ ?>
</div>
<?php else : // this is displayed if there are no comments so far ?>
<p class="nocomments">No comments.</p>
<?php endif; ?>
<?php if (('open' == $post->comment_status) && ('open' == $post->ping_status)) : // open ?>
<p><?php comments_rss_link('Comment feed'); ?></p>
<?php endif; ?>
<?php if ('open' == $post->comment_status) : ?>
<h3 class="comments-head">Comment</h3>
<?php if ( get_option('comment_registration') && !$user_ID ) : ?>
<p>You must be <a href="<?php echo get_option('siteurl'); ?>/wp-login.php?redirect_to=<?php the_permalink(); ?>">logged in</a> to post a comment.</p>
<?php else : ?>
<form action="<?php echo get_option('siteurl'); ?>/wp-comments-post.php" method="post" name="commentform" id="commentform">
<div id="comments-open-data">
<?php if ( $user_ID ) : ?>
<p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. (<a href="<?php echo get_option('siteurl'); ?>/wp-login.php?action=logout" title="Log out of this account">Logout</a>)</p>
<?php else : ?>
<p><label for="author">Name:<?php if ($req) echo "(required)"; ?></label><br />
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="2" accesskey="n" />
</p>
<p><label for="email">Mail: (will not be published) <?php if ($req) echo "(required)"; ?></label><br />
<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" size="22" tabindex="3" accesskey="m" />
</p>
<p><label for="url">Website:</label><br />
<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" size="22" tabindex="4" accesskey="w" />
</p>
<?php endif; ?>
<p><label for="url">Comment:</label><br />
<textarea name="comment" id="comment" cols="40" rows="8" tabindex="5" accesskey="c" onfocus="if (this.value == 'Please comment') this.value = '';" onblur="if (this.value == '') this.value = 'Please comment';">Please comment</textarea>
</p>
<p>XHTML: You can use these tags:<br /><?php echo allowed_tags(); ?></p>
<p><input name="submit" type="submit" id="submit" tabindex="6" value="Submit" accesskey="s" />
<input type="hidden" name="comment_post_ID" value="<?php echo $id; ?>" />
</p>
<?php do_action('comment_form', $post->ID); ?>
</div>
</form>
<?php endif; // If registration required and not logged in ?>
<?php endif; // if you delete this the sky will fall on your head ?>
</div><!-- comments -->
入れ替える内容(1)
<h3 class="comments-head">Trackbacks</h3>
<div class="tarckbacktlist">
<?php listtrackpings('', '<div id="comment--%id" class="comment"><div class="comment-content"><p>%content</p></div><a href="%url"></a><p class="comment-footer">Tracked on <a href="#comment-%id">%date</a> by %origin</div>','Y.m.j'); ?>
</div>
<h3 class="comments-head">Comments</h3>
<div class="commentlist">
<?php foreach ($comments as $comment) : ?>
<? if ($comment->comment_type != "trackback" && $comment->comment_type != "pingback" && !ereg("<pingback />", $comment->comment_content) && !ereg("<trackback />", $comment->comment_content)) { ?>
<div id="comment-<?php comment_ID() ?>" class="comment">
<?php if ($comment->comment_approved == '0') : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
<div class="comment-content"><?php comment_text() ?></div>
<p class="comment-footer">Posted at <a href="#comment-<?php comment_ID() ?>"><?php comment_date('Y.m.j') ?> <?php comment_time() ?></a> by <?php comment_author_link() ?><?php if ( $user_ID ) : ?> | <?php edit_comment_link('edit','',''); ?><?php endif; ?></p>
</div>
<? } ?>
<?php endforeach; /* end for each comment */ ?>
</div>
(1)を適用した場合の表示

入れ替える内容(2)
<h3 class="comments-head">Trackbacks</h3>
<div class="tarckbacktlist">
<?php if ($trackbacks = trackpings("", 'both')) {
foreach ($trackbacks as $trackback) : ?>
<div id="comment-<?php echo($trackback->comment_ID); ?>" class="comment">
<div class="comment-content">
<?php $tmp_content = ereg_replace("(<strong>.*</strong>)(.*)","<p>\\1</p><p>\\2</p>",$trackback->comment_content); echo($tmp_content); ?>
</div>
<p class="comment-footer">Tracked on <a href="#comment-<?php echo($trackback->comment_ID); ?>">
<?php echo(mysql2date('Y.m.j h:m A', $trackback->comment_date)); ?>
</a> by
<a href="<?php $tmp_url = esc_url($trackback->comment_author_url, array('http', 'https')); echo($tmp_url); ?>"><?php echo($trackback->comment_author); ?></a>
<?php if ( $user_ID ) : ?> | <a class="comment-edit-link" href="<?php echo(admin_url('comment.php?action=editcomment&c=')); ?><?php echo($trackback->comment_ID); ?>">edit</a>
<?php endif; ?></p>
</div>
<?php endforeach;
} ?>
</div>
<h3 class="comments-head">Comments</h3>
<div class="commentlist">
<?php foreach ($comments as $comment) : ?>
<? if ($comment->comment_type != "trackback" && $comment->comment_type != "pingback" && !ereg("<pingback />", $comment->comment_content) && !ereg("<trackback />", $comment->comment_content)) { ?>
<div id="comment-<?php comment_ID() ?>" class="comment">
<?php if ($comment->comment_approved == '0') : ?>
<em>Your comment is awaiting moderation.</em>
<?php endif; ?>
<div class="comment-content"><?php comment_text() ?></div>
<p class="comment-footer">Posted at <a href="#comment-<?php comment_ID() ?>"><?php comment_date('Y.m.j') ?> <?php comment_time() ?></a> by <?php comment_author_link() ?><?php if ( $user_ID ) : ?> | <?php edit_comment_link('edit','',''); ?><?php endif; ?></p>
</div>
<? } ?>
<?php endforeach; /* end for each comment */ ?>
</div>
(2)を適用した場合の表示

4. comments.php
3.2項の作業が分からない場合、comments.php ファイルへのリンクをおきましたので、ファイルをダウンロードして、展開した中にある内容を「コメント」の内容と入れ替えてください。
- comments1.zip(3.2項の(1)を反映)
- comments2.zip(3.2項の(2)を反映)
5.プラグインを利用しない方法
ネットで調べていたら、以下のページでプラグインを利用せずにコメントとトラックバックを分けて表示するカスタマイズが紹介されていました。
コメントとトラックバックを分けて表示する for WordPress(その2:タイトルを非表示にする方法)
前回エントリーした「コメントとトラックバックを分けて表示する for WordPress(その1)」では、記事に対しコメント・トラックバックがない場合でも「コメント」および「トラックバック」のタイトルを非表示にすることができません。
ということで本エントリーでタイトルを非表示にする方法を紹介します。このカスタマイズで下記のような動作になります。
- コメント・トラックバックとも0件の場合、コメントタイトル・トラックバックタイトルを非表示
- コメントが0件の場合:コメントタイトルを非表示
- トラックバックが0件の場合、トラックバックタイトルを非表示
下記は当サイト配布のテンプレートでのカスタマイズ例です。シングルポスト本文下のトラックバックURL・トラックバック・コメント・コメントフォームが上記のそれぞれのケースでどのように表示されるか参考にしてください。
本エントリーでは公開テンプレートをサンプルにして説明しておりますが、非表示にする仕組みを3項で説明していますので、他のテンプレートでも同様の機能を実装することが可能です。
なお本エントリーのカスタマイズを実施する前に「コメントとトラックバックを分けて表示する for WordPress(その1)」の3.1項までの作業は完了させておいてください。
このエントリーは元記事の3.2項の表示方法を変更する説明のみです。
1.プラグインの修正
WordPress の管理画面にログインし、[プラグイン] - [プラグインエディタ] をクリックし、右側にある「プラグインファイル」より「Trackping Separator」をクリックします。
そして下記の青色部分を追加します。
//This function has the same effect as template function comments_number(), but it return only the number of comments. Track/Ping backs are not included.
function comments_only_number($no='', $one='', $many='') {
global $wpdb, $tablecomments, $post;
$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post->ID AND comment_type = '' AND comment_approved = '1'");
$cnt = count($comments);
if (!$cnt)
echo $no;
elseif ($cnt == 1)
echo $one;
else
echo str_replace("%", $cnt, $many);
}
function get_comments_only_number($no='', $one='', $many='') {
global $wpdb, $tablecomments, $post;
$comments = $wpdb->get_results("SELECT * FROM $wpdb->comments WHERE comment_post_ID = $post->ID AND comment_type = '' AND comment_approved = '1'");
$cnt = count($comments);
if (!$cnt)
return $no;
elseif ($cnt == 1)
return $one;
else
return str_replace("%", $cnt, $many);
}
2.コメントテンプレートの入れ替え
ここでは公開テンプレート用の comment.php を丸ごと入れ替える手順で説明します。下記のいずれかのリンクをクリックしてコメント用テンプレートをダウンロードします。
解凍した中にある comments.php を任意のエディタで開きます。
そして WordPress の管理画面にログインし、[表示] - [テーマエディタ]で「コメント」を選択、comments.php の内容を丸ごとテキストエリアの内容と入れ替え、保存してください。
3.非表示にする方法
下記のそれぞれのPHPソースのように、0件の時に非表示にしたい部分を青色部分のコードで括ります。
3.1 コメントが0件の時に非表示にする
<?php if (get_comments_only_number('0', '1', '%') != '0') { ?>
:
<? } ?>
3.2 トラックバックが0件の時に非表示にする
<?php if (trackpings('count') != '(0)') { ?>
:
<? } ?>
トラックバック件数取得はプラグインの実装をそのまま利用できるのですが、コメント件数の取得ができなかったため、1項でソースコードを追加しています。
もう少し適切な実装があるかもしれませんがとりあえず。
コメントとトラックバックを分けて表示する for WordPress(その1)
WordPress デフォルト状態では、投稿情報や個別記事でのコメントとトラックバックが別々に表示されない仕様になっています。別々に表示されるブログツールやブログサービスを利用された方が WordPress に移行されると、この表示に違和感があるかもしれません(逆に便利と感じるかもしれません)。
このエントリーでは他のサイトでも数多く紹介されている、コメントとトラックバックを独立して表示させるカスタマイズを紹介します。
2009.08.13 追記
本記事には一部不具合があるため、「コメントとトラックバックを分けて表示する for WordPress(改)」をご覧ください。
1.プラグインのダウンロード
下記のサイトよりの「Download」にある Trackping Separator. を右クリックしてプラグインファイルを trackpings.php という名前でダウンロードします。

2.プラグインのアップロード・有効化
ダウンロードした trackpings.php を /wp-content/plugins 配下にアップロードします。その後、WordPress の管理画面にログインし、[プラグイン] で Trackping Separator が表示されていると思いますので、一番右にある「有効化」のリンクをクリックし、緑色の表示になればOKです。

3.テンプレートの修正
WordPress の管理画面にログインし、[表示] - [テーマエディタ]で以下の各テンプレートを修正します。
3.1 インデックス/アーカイブ/検索結果/シングルポスト
インデックス/アーカイブ/検索結果/シングルポストの各テンプレートに投稿者情報(投稿時間・カテゴリー等)がある場合は、 comments_popup_link で検索し、
<?php comments_popup_link('No Comments', '1 Comment', '% Comments'); ?>
というタグを見つけ、下記のように変更します。変更前のタグの内容はご利用のテンプレートによって若干異なりますのでご注意ください。
WordPress 2.5 以上 + プラグインバージョン 2.0 以上の場合
<?php comments_popup_link('Comments (0)', 'Comments (1)', 'Comments (%)'); ?> | <a href="<?php the_permalink() ?>#trackback" title="Trackback" class="trackacklink">Trackbacks (<?php echo trackpings('count'); ?>)</a>
WordPress 2.4 以前 + プラグインバージョン1.1.1の場合
<?php comments_only_popup_link('Comments (0)', 'Comments (1)', 'Comments (%)'); ?> | <a href="<?php the_permalink() ?>#trackback" title="Trackback" class="trackacklink">Trackbacks (<?php echo trackpings('count'); ?>)</a>
なお、シングルポストではコメント数の表示の正常性が確認できておりません。シングルポストで動作を有効にする場合、プラグインバージョン1.1.1であれば、下記(抜粋)の赤色部分、
function comments_only_popup_link($zero='No Comments', $one='1 Comment', $more='% Comments', $CSSclass='', $none='Comments Off') {
global $id, $wpcommentspopupfile, $wpcommentsjavascript, $post, $wpdb;
global $comment_count_cache;
if (! is_single() && ! is_page()) {
if ( !isset($comment_count_cache[$id]))
:
(略)
:
echo '</a>';
}
}
}
を削除またはコメントアウトすれば動作するようです。ただしあえてこのような実装になっているので、コメントアウトまたは削除することでシングルポストやゲストブックの他の部分に何らかの影響があるかもしれません(この点につきましては未確認です)。
またシングルポスト自体にはコメント本文とトラックバック本文が表示されるので、当サイトでの配布テンプレートのように投稿者情報を本文下に表示している場合は、投稿者情報からコメント・トラックバックの表示自体を削除しても良いかもしれません。
3.2 コメント
ここでは公開テンプレート用の comment.php を丸ごと入れ替える手順で説明します。下記のいずれかのリンクをクリックしてコメント用テンプレートをダウンロードします。
解凍した中にある comments.php を任意のエディタで開きます。
そして WordPress の管理画面にログインし、[表示] - [テーマエディタ]で「コメント」を選択、comments.php の内容を丸ごとテキストエリアの内容と入れ替え、保存してください。
4.参考・関連リンク
2007.04.11 追記
Trickster さんより頂いたコメントを元に、3.1項のシングルポストの記述を修正しました。
2008.08.03 追記
プラグインバージョン 2.0 以上の変更方法を追加しました。
WordPress のコメントをページ分割する Paged Comments Plugin
WordPress のコメントを分割表示する Paged Comments Plugin をご紹介します。このプラグインを用いることでスクリーンショットのようにコメントを分割表示することができます。

このプラグインはコメント以外に Guestbook のコメント分割も可能です(Guestbook での利用方法については別エントリーで紹介します)。
以下、カスタマイズ方法です。
1.プラグインのダウンロード
Paged Comments Plugin の Download ? Latest Version の Version x.x (200x-xx-xx) のリンクをクリックします。
2.プラグインのアップロード
アーカイブを解凍し、paged-comments-config-sample.php を paged-comments-config.php にリネームします。
また、解凍したプラグインフォルダ直下にある、
paged-comments.phppaged-comments-config.php
を plugins ディレクトリにアップロードします。
また同梱されている themes/[テーマ名] 配下にある、いずれかの comments-paged.php を現在利用中のテーマディレクトリに配置します。
上記をまとめると、下記の配置になれば OK です。
wp-content
├ plugins
│ ├ paged-comments.php
│ └ paged-comments-config.php
└ themes
└ [利用中テーマディレクトリ]
└ comments-paged.php
3.プラグインの有効化
管理メニューの[プラグイン]をクリックして、表示されている「Paged Comments」右側にある[アクション]欄の「有効化」をクリックします。緑色で表示されれば OK です。
4.小粋空間テーマ用 comments-paged.php
当サイトで配布中の WordPress テーマ用に作成した comments-paged.php です。よろしければ下記のリンクをクリックしてダウンロードしてください。バージョン 2.5 までは動作確認できています。
解凍した中にある comments-paged.php を、2項でアップロードした comments-paged.php と差し替えてください。
5.paged-comments-config.php のカスタマイズ
分割表示の詳細な設定は paged-comments-config.php をカスタマイズします。下記に各設定項目の内容を紹介します。
$paged_comments->all_posts- true:パーマリンク(is_single())でのページ分割を有効
- false:パーマリンク(is_single())でのページ分割を無効
$paged_comments->all_pages- true:他のページ(is_page())ページ分割を有効
- false:他のページ(is_page())ページ分割を無効
$paged_comments->per_page- 分割コメント数
$paged_comments->ordering- 'ASC':コメントの表示順序を昇順にする
- 'DESC':コメントの表示順序を降順にする
$paged_comments->fill_last_page- true:最後のページに per_page のコメント数を表示
- false:最後のページに per_page のコメント数を表示しない
$paged_comments->page_range- 表示する分割ページ数
$paged_comments->fancy_url- true:カスタム URI を利用している場合、URI の最後にコメントページを設定
- false:カスタム URI を利用している場合、URI の最後にコメントページを設定しない
$paged_comments->show_all_option- true:"Show All(全コメント表示)" のリンクを表示
- false:"Show All(全コメント表示)" のリンクを表示しない
$paged_comments->show_all_ordering- 'ASC':"Show All" をクリックした時の表示順序を昇順にする
- 'DESC':"Show All" をクリックした時の表示順序を降順にする
$paged_comments->default_page- first:デフォルトページを最初のページ(ordering = 'ASC':1ページ目/ordering = 'DESC':最後のページ)
- last:デフォルトページを最後のページ(ordering = 'ASC':最後のページ/ordering = 'DESC':1ページ目)
- auto:デフォルトページを ordering で決定
