シンプルなコメントループ
// Get only the approved comments
$args = array(
'status' => 'approve',
);
// The comment Query
$comments_query = new WP_Comment_Query();
$comments = $comments_query->query( $args );
// Comment Loop
if ( $comments ) {
foreach ( $comments as $comment ) {
echo '<p>' . $comment->comment_content . '</p>';
}
} else {
echo 'No comments found.';
}
comments.php
テンプレートには、データベースからコメントを取得し、テーマに表示するために必要なすべてのロジックが含まれています。
テンプレートファイルを探る前に、single.php
のような適切なページで部分テンプレートファイルを取り込む方法を知っておく必要があります。コメント テンプレートタグ を条件文でラップし、意味がある場合にのみ comments.php を取り込むようにします。
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
別の comments.php の例
こちらは、Twenty Thirteen テーマに含まれる comments.php
テンプレートの例です:
<?php
/**
* The template for displaying Comments.
*
* The area of the page that contains comments and the comment form.
*
* @package WordPress
* @subpackage Twenty_Thirteen
* @since Twenty Thirteen 1.0
*/
/*
* If the current post is protected by a password and the visitor has not yet
* entered the password we will return early without loading the comments.
*/
if ( post_password_required() ) {
return;
}
?>
<div id="comments" class="comments-area">
<?php if ( have_comments() ) : ?>
<h2 class="comments-title">
<?php
printf(
_nx(
'One thought on "%2$s"',
'%1$s thoughts on "%2$s"',
get_comments_number(),
'comments title',
'twentythirteen'
),
number_format_i18n( get_comments_number() ),
'<span>' . get_the_title() . '</span>'
);
?>
</h2>
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'short_ping' => true,
'avatar_size' => 74,
) );
?>
</ol><!-- .comment-list -->
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
<nav class="navigation comment-navigation" role="navigation">
<h1 class="screen-reader-text section-heading"><?php _e( 'Comment navigation', 'twentythirteen' ); ?></h1>
<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentythirteen' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentythirteen' ) ); ?></div>
</nav><!-- .comment-navigation -->
<?php endif; // Check for comment navigation ?>
<?php if ( ! comments_open() && get_comments_number() ) : ?>
<p class="no-comments"><?php _e( 'Comments are closed.', 'twentythirteen' ); ?></p>
<?php endif; ?>
<?php endif; // have_comments() ?>
<?php comment_form(); ?>
</div><!-- #comments -->
comments.php の分解
上記の comments.php
は、より良い理解のために以下の部分に分解できます。
- 1. テンプレートヘッダー
- 2. コメントタイトル
- 3. コメントリスト
- 4. コメントページネーション
- 5. コメントが閉じられているメッセージ.
- 6. 終了
テンプレートヘッダー
このテンプレートは、テンプレートを特定することから始まります。
<?php
/**
* The template for displaying Comments.
*
* The area of the page that contains comments and the comment form.
*
* @package WordPress
* @subpackage Twenty_Thirteen
* @since Twenty Thirteen 1.0
*/
次に、投稿がパスワード保護されているかどうかを確認し、そうであればテンプレートの処理を停止します。
/*
* If the current post is protected by a password and the visitor has not yet
* entered the password we will return early without loading the comments.
*/
if ( post_password_required() )
return;
?>
最後に、この投稿に関連するコメントがあるかどうかを確認します。
<div id="comments" class="comments-area">
<?php if ( have_comments() ) : ?>
コメントタイトル
コメントの上に表示されるヘッダーを出力します。
他の開発者が代替言語翻訳を提供できるように、_nx() 翻訳関数を使用します。
<h2 class="comments-title">
<?php
printf(
_nx(
'One thought on "%2$s"',
'%1$s thoughts on "%2$s"',
get_comments_number(),
'comments title',
'twentythirteen'
),
number_format_i18n( get_comments_number() ),
'<span>' . get_the_title() . '</span>'
);
?>
</h2>
コメントリスト
以下のスニペットは、wp_list_comments() 関数を使用してコメントの順序付きリストを作成します。
<ol class="comment-list">
<?php
wp_list_comments( array(
'style' => 'ol',
'short_ping' => true,
'avatar_size' => 74,
) );
?>
</ol><!-- .comment-list -->
コメントページネーション
コメントナビゲーションを追加するのに十分なコメントがあるかどうかを確認し、そうであればコメントナビゲーションを作成します。
<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
<nav class="navigation comment-navigation" role="navigation">
<h3 class="screen-reader-text section-heading"><?php _e( 'Comment navigation', 'twentythirteen' ); ?></h3>
<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentythirteen' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentythirteen' ) ); ?></div>
</nav><!-- .comment-navigation -->
<?php endif; // Check for comment navigation ?>
コメントが閉じられているメッセージ。
コメントが開いていない場合、閉じられていることを示す行を表示します。
<?php if ( ! comments_open() && get_comments_number() ) : ?>
<p class="no-comments"><?php _e( 'Comments are closed.', 'twentythirteen' ); ?></p>
<?php endif; ?>
終了
このセクションはコメントループを終了し、コメントフォームを含め、コメントラッパーを閉じます。
<?php endif; // have_comments() ?>
<?php comment_form(); ?>
</div><!-- #comments -->
コメントのページネーション
コメントが多い場合(ページが長くなる)、コメントをページネーションすることにはいくつかの潜在的な利点があります。ページネーションは、特にモバイルデバイスでのページ読み込み速度を改善するのに役立ちます。
コメントのページネーションを有効にするには、2つのステップを実行します。
- 1. WordPress 内でコメントをページ分けするには、設定 > 議論 に移動し、「コメントをページに分ける」ボックスをチェックします。「ページごとのトップレベルコメント数」に任意の数を入力できます。
- 2.
comments.php
テンプレートファイルを開き、コメントページネーションを表示したい場所に次の行を追加します。
<div class="pagination">
<?php paginate_comments_links(); ?>
</div>
代替コメントテンプレート
場合によっては、テーマ内でコメントを異なる方法で表示したいことがあります。そのためには、代替ファイル(例:short-comments.php)を作成し、次のように呼び出します:
<?php comments_template( '/short-comments.php' );
代替コメントテンプレートに使用されるファイルのパスは、現在のテーマのルートディレクトリに対して相対的であり、サブフォルダを含む必要があります。カスタムコメントテンプレートがテーマ内のフォルダにある場合、呼び出すと次のようになります:
<?php comments_template( '/custom-templates/alternative-comments.php' );
関数リファレンス
- wp_list_comments() : 管理エリアで設定されたさまざまなパラメータに基づいて、投稿またはページのすべてのコメントを表示します。
- comment_form() : このタグは、テンプレート内で使用するための完全なコメントフォームを出力します。
- comments_template() : 最初の引数で指定されたコメントテンプレートを読み込みます。
- paginate_comments_links() : 現在の投稿のコメントのためのページネーションリンクを作成します。
- get_comments() : 引数を使用してコメントを取得します。
- get_approved_comments() : 提供された投稿 ID の承認されたコメントを取得します。