[_s] single.php

前回からの続きです。

_sのhtmlの構造は、単純に考えれば、以下のようになります。

<html>
<head>
  <title>タイトル</tilte>
</head>
<body>
  <header>
    ヘッダー
  </header>
  <div id="primary">
        メイン
  </div><!-- #primary -->
  <aside>
    サイドバー
  </aside>
  <footer>
    フッター
  </fotter>
</body>
</html>

このhtmlは、_sで以下のphpファイルにそれぞれ分割されます。

  • <html>から</header>はheader.php
  • <div id=”primary”>から</div><!– #primary –>はindex.php、single.php…
  • <aside>から</aside>はsidebar.php
  • <footer>から</html>はfooter.php

WordPressでは、header.phpはget_header()関数、sidebar.phpはget_sidebar()関数、footer.phpはget_footer()関数と、テンプレートパーツを読み込むための関数を用意してくれているので、それらの関数を用いると下のようなphpファイルになります。 これは、index.phpやsingle.php、page.php…といったそれぞれのテンプレートファイルで共通で、メインの部分がそれぞれの役割によって異なってきます。

<?php 
get_header() 
?>
  <div id="primary">
     メイン
  </div><!-- #primary -->
<?php
get_sidebar();
get_footer();

single.php

_sのsingle.phpを見ると、get_header()関数、get_sidebar()関数、get_footer()関数が、上と同じように配置されています。

<?php
/**
* The template for displaying all single posts
*/
get_header();
?>
	<div id="primary" class="content-area">
		<main id="main" class="site-main">

		<?php
		while ( have_posts() ) :
		the_post();
		get_template_part( 'template-parts/content', get_post_type() );
		the_post_navigation();
		// 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;
		endwhile; // End of the loop.
		?>

		</main><!-- #main -->
	</div><!-- #primary -->
<?php
get_sidebar();
get_footer();

問題となるのはそれらの間にある部分ですが、div=”primary” class=content-area”><main id=”main” class=”site-main”> と</main></div><!– primary –>は、それぞれのテンプレートファイルで共通していると思います。なのでphpのコードに注目すると、まずはwhileループが目に留まります。

<?php
while ( have_posts() ) :
  the_post();

  //省略

endwhile; // End of the loop.
?>

このwhileのループですが、WordPressでメインループと呼ばれるものです。以前、WordPressはデータベースに情報を全て保存していると書きましたが、このコードは、要求されている情報をデータベースで調べます。今読んでいるファイルはsingle.phpなので、このコードは要求されている投稿を探し出して、省略の部分に書かれている処理を見つかった投稿に対して行います。

この次に、get_template_part()という関数が続いています。

get_template_part( 'template-parts/content', get_post_type() );

メインループの内部では、データベースで探した情報を表示するのですが、この部分でその表示のためのテンプレートパーツファイルを読み込みます。

get_template_part()関数は、 テーマを作る人が独自に定義できるget_header()関数のようなもので、get_template_part( $slug, $name )と引数を2つとると、 {slug}-{name}.php というテンプレートパーツファイルを読み込みます。{slug}-{name}.phpを読み込もうとして見つからない場合は、 {slug} .phpを読み込みます。

get_post_type()関数はそのままですが、ポストタイプを返す関数です。ポストタイプについては以下のリンクをご確認ください。

https://codex.wordpress.org/Post_Types

_sのtemplate-partsディレクトリには、content.php、content-none.php、content-page.php、content-search.phpというファイルがあります。

get_template_part( ) 関数が作りうるファイル名で合致するのはcontent-page.phpのみ、また今読んでいるのは single.phpで、つまり個別投稿のためポストタイプはpostになるなので、結局content.phpが読み込まれます。

次は、the_post_navigationという関数が続きます。

the_post_navigation();

この関数は、次の投稿・前の投稿へのリンクを表示するための関数です。

その次はそのまま、コメントです。

// 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を読み込みます。

ここまでをもう一度振り返ると、single.phpは下のようになっていました。

<?php
//メインループの開始。投稿があるかデータベースを確認
while ( have_posts() ) : 
  //見つかった投稿
  the_post(); 
  //見つかった投稿を表示するためのテンプレートを読み込んでhtmlを作成
  get_template_part( 'template-parts/content', get_post_type() ); 
  //次の投稿、前の投稿
  the_post_navigation(); 
  //コメントの表示
  // 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;

endwhile; // End of the loop.
?>

その他、投稿が見つからない場合は、_sは、single.phpではなく404.phpを表示します。

他のテンプレートファイルも基本的に同じ作りになっていると思います。次回以後確認します。

次回に続きます。