WordPress:シングルページにループはいらない

WordPress:シングルページにループはいらない

WordPress の個別投稿ページのテンプレート single.php ではループ処理はいらないという話です。

01ループ処理とは

Developer Resources の Post Template Files にある single.php のサンプルコードには公式テーマ(なのかな…)Twenty Fifteen の例として次のコードが記載されています。

<?php
/**
 * The template for displaying all single posts and attachments
 *
 * @package WordPress
 * @subpackage Twenty_Fifteen
 * @since Twenty Fifteen 1.0
 */
 
get_header(); ?>
 
    <div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">
 
        <?php
        // Start the loop.
        while ( have_posts() ) : the_post();
 
            /*
             * Include the post format-specific template for the content. If you want to
             * use this in a child theme, then include a file called called content-___.php
             * (where ___ is the post format) and that will be used instead.
             */
            get_template_part( 'content', get_post_format() );
 
            // 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;
 
            // Previous/next post navigation.
            the_post_navigation( array(
                'next_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Next', 'twentyfifteen' ) . '</span> ' .
                    '<span class="screen-reader-text">' . __( 'Next post:', 'twentyfifteen' ) . '</span> ' .
                    '<span class="post-title">%title</span>',
                'prev_text' => '<span class="meta-nav" aria-hidden="true">' . __( 'Previous', 'twentyfifteen' ) . '</span> ' .
                    '<span class="screen-reader-text">' . __( 'Previous post:', 'twentyfifteen' ) . '</span> ' .
                    '<span class="post-title">%title</span>',
            ) );
 
        // End the loop.
        endwhile;
        ?>
 
        </main><!-- .site-main -->
    </div><!-- .content-area -->
 
<?php get_footer(); ?>

このコードのうち、

// Start the loop.
while ( have_posts() ) : the_post();

// End the loop.
endwhile;

がループ処理で、ここにデータがあればという if (have_posts()) : endif; をつける場合も多いです。

02ループがなくても個別投稿ページは表示される

で、ループはその名のとおり、データが複数個あればそれを繰り返すということですので、一記事を表示する個別投稿ページにループは必要かという疑問が湧いてきます。

結論から言いますと、なくても個別投稿ページは表示されます。

現在、別サイト「そんなには褒めないよ。映画評」に使っている single.php のコードです。

<main class="main-container">
	<?php //if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
	<article class="entry">
		<nav class="breadcrumbs"><?php get_imz_breadcrumbs(get_the_ID()); ?></nav>
		<header class="entry-header">
			<h1 class="entry-title"><?php the_title(); ?></h1>
			<p class="entry-meta">
				<span class="date"><?php the_time('Y.m.d'); ?></span>
				<span class="category"><?php the_category( ', ', 'multiple'); ?></span>
				<span><?php edit_post_link(); ?></span>
			</p>
		</header>
		<div class="entry-body"><?php the_content(); ?></div>
	</article>
	<?php //endwhile; endif; ?>
</main>

上のようにループをコメントアウトしても同じように表示されます。

03ただし、the_date() は使えない

the_date() は使えなくなりますが、the_time(‘Y.m.d’) などで代用できますので問題はありません。

ループの中では同じ日付の記事には一度しか the_date() は表示されないことを記事にしましたが、the_date() はループを使っているということだと思います。

コードを調べてはいませんが、おそらく投稿記事ページが呼ばれた段階で WordPress システムが記事データを読み込んでいるんだと思います。

ということで、必要のないコードを削除すれば誤差程度ではあっても多少は早く表示されることになると思います。

注意としては、have_posts() や the_post() に関わるアクションフックやプラグインを使っている場合はうまくいかなくなる可能性があります。the_date() もその例だと思います。

いずれにしても問題が発生しなければ言葉通り問題ないということです。