MENU
Wordpress制作を学ぶためのブログ
Nino-Blog
Nino-Blog
  1. ホーム
  2. wordpress
  3. テーマ作り
  4. 【WordPress自作テーマ開発④】下層ページを作ろう「投稿ページ編」

【WordPress自作テーマ開発④】下層ページを作ろう「投稿ページ編」

2025 1/28
wordpress テーマ作り
2022年1月9日2025年1月28日

みなさんこんにちは。
wordpressで自作テーマを開発しブログサイトを作るこの企画も第4回となりました。
第4回となる今回は下層ページの「投稿ページ(管理画面→投稿から作成した記事を表示するページ)」を作りたいと思います。
下層ページとは、簡単に言うとトップページからクリックした際に移行した先のページをさします。

それではいきましょう!
前回までの記事をまだ見ていなからは以下のリンクからそうぞ

【WordPress自作テーマ開発①】開発環境構築編

【WordPress自作テーマ開発②】自作テーマ制作を効率的に行うための準備

【WordPress自作テーマ開発③】トップページを作ろう

\ NinoBlogのサービス紹介です! /

実績100件以上!集客できるホームページ制作します SEO対策とデザインで集客力UP!更新可能なホームページを!
目次

投稿ページを作ろう

投稿ページを作成する前に現在の表示を確認しましょう。
以下が現在の表示です。

トップページの記事をクリックして移行した先の投稿ページです。
この投稿ページは「single.php」が出力したものになります。
トップページと同じくヘッダー、コンテンツ、サイドバー、フッターからなるページです。
ヘッダー、サイドバー、フッターの表示がトップページと同じことに気づくかと思います。
これは、get_header();、get_sideber();、get_footer();によって出力されている部分で前回のトップページを作ろうで編集がheader.php、sideber.php、footer.phpと、それぞれのページファイルで反映されているためです。
(このパーツを繰り返し活用できる点がwordpressのポイントです。)

完成図を確認

次に完成図を確認します。
以下をご覧ください。

投稿ページ完成図

上記の画像が完成レイアウトとなります。
記事とサイドバーの2カラムで表示をさせています。
ポイントとしては、
「パンくずリスト(トップ>JavaScript>テスト投稿15の部分)」を設置ししております。
パンくずリストを設置するとユーザーの利便性が上がります。さらにSEO対策にもなりますので一石二鳥でブログサイトでは設置は必須と言ってもいいくらいです。

投稿ページ作成の流れ

投稿ページの作成の流れとしては、

  1. _s(underscores)ダウンロード初期状態のsingle.phpの内容を確認
  2. single.phpに追記、削除
  3. functions.phpにパンくずリストのコードを追記
  4. content-post.phpを作成し追記(コンテンツ部分を表示させるファイル)

大きく分けて以上の工程で投稿ページを作成していきます。

_s(underscores)ダウンロード初期状態のsingle.phpを確認

まず、追記前のsingle.phpにどの様なコードが書かれているのかを確認していきます。

<?php
/**
 * The template for displaying all single posts
 *
 * @link https://developer.wordpress.org/themes/basics/template-hierarchy/#single-post
 *
 * @package BlogCreateChallenge
 */

get_header();//ヘッダーを出力
?>

	<main id="primary" class="site-main"><!--以下よりコンテンツ部分の出力-->

		<?php
		while ( have_posts() ) ://while文でこれより下の内容を繰り返す。
			the_post(); ?>

        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>><!--id,classに投稿関連のid,クラスを追加-->
	<header class="entry-header">
		<?php
		if ( is_singular() ) ://個別の投稿を表示中であるかチェック。つまり、投稿ページ、固定ページが表示されていればtureとなる
			the_title( '<h1 class="entry-title">', '</h1>' );//記事タイトルをH1タグで出力
		else ://個別投稿を表示中でなければ以下を実行。
			the_title( '<h2 class="entry-title"><a href="' . esc_url( get_permalink() ) . '" rel="bookmark">', '</a></h2>' );//記事タイトルをH2で出力
		endif;//if文終了

		if ( 'post' === get_post_type() ) ://投稿タイプが”投稿”(管理画面の投稿からの記事)であれば、
			?>
			<div class="entry-meta">
				<?php
				blogcreatechallenge_posted_on();//blogcreatechallenge_posted_onという関数を呼び出し投稿日を出力(この関数はテーマファイルのincディレクトリ内にあるtemplate-tags.phpで定義されています。)
				blogcreatechallenge_posted_by();//blogcreatechallenge_posted_byという関数を呼び出し投稿者を出力(この関数はテーマファイルのincディレクトリ内にあるtemplate-tags.phpで定義されています。)
				?>
			</div>
		<?php endif; ?><!--if文終了-->
	</header>

	<?php blogcreatechallenge_post_thumbnail(); ?><!-- blogcreatechallenge_post_thumbnailという関数を呼び出し投稿のサムネイルを出力(この関数はテーマファイルのincディレクトリ内にあるtemplate-tags.phpで定義されています。) -->

	<div class="entry-content">
		<?php
		the_content(//投稿した記事の内容を出力
			sprintf(
				wp_kses(
					/* translators: %s: Name of current post. Only visible to screen readers */
					__( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'blogcreatechallenge' ),
					array(
						'span' => array(
							'class' => array(),
						),
					)
				),
				wp_kses_post( get_the_title() )
			)
		);

		wp_link_pages(
			array(
				'before' => '<div class="page-links">' . esc_html__( 'Pages:', 'blogcreatechallenge' ),
				'after'  => '</div>',
			)
		);
		?>
	</div><!-- .entry-content -->

	<footer class="entry-footer">
		<?php blogcreatechallenge_entry_footer(); ?><!--blogcreatechallenge_entry_footer()という関数を呼び出し表示されている投稿のカテゴリ、コメントを表示(この関数はテーマファイルのincディレクトリ内にあるtemplate-tags.phpで定義されています。)-->
	</footer>
</article><!-- #post-<?php the_ID(); ?> -->

		 <?php endwhile; ?><!--while文終了-->

	</main><!-- コンテンツ部分の出力終了 -->

<?php
get_sidebar();//サイドバー出力
get_footer();//フッター出力

コードの解説ですが、コード内のコメントをご覧ください。

上記のコードを見ると、single.phpはのコンテンツ部分を出力している「mainタグ内」の記述は全て直書きとなっています。
と言うのも、前回のトップページを制作した際のindex.phpではコンテンツ部分の表示は「get_template_part( ‘template-parts/content’);」でcontent.phpを呼び出し出力する形で分けられていました。

そのため、今回のsingle.phpのコンテンツ部分を出力する「mainタグ内」のコードがとても多く感じますね

single.phpを添削

ではsingle.phpのコードに追記、削除を行っていきます。
以下が添削したコードになります。

<?php get_header(); ?>

<div class="ly_cont ly_cont__col">
    <main class="ly_cont_main">
        <div class="post-breadcrumb">
            <?php output_breadcrumb(); ?>
        </div>
        <?php
					while ( have_posts() ) : the_post();
						get_template_part( 'template-parts/content-post');
					endwhile;
			?>
    </main>
    <?php get_sidebar();?>
</div>
<?php get_footer();?>

とてもスッキリしたと思います。
記事を出力する部分を全てcontent-post.phpから呼び出す形にした為です。

追記したコード解説

●5行目〜7行目(上記のコード)

<?php output_breadcrumb(); ?>

このコードはfunctions.phpに書いた「パンくずリスト」を表示させる関数を呼び出しています。
ですが、まだfunctions.phpに「パンくずリスト」を表示させる関数を定義してませんのでこのままサイトを表示するとエラーになってしまいます。
パンくずリストを出力するコードをfunctions.phpに記述しましょう。

functions.phpにパンくずリストを出力させる関数を追記する

追記したコードを解説している途中ですが、以下のコードをfunctions.phpの最後に追記しましょう。

// パンくずリスト
function output_breadcrumb(){
	$home = '<li><a href="'.get_bloginfo('url').'">トップ</a></li>';
	echo '<ul class="breadcrumb">';
  
	// トップページ
	if ( is_front_page() ) {
  
	// カテゴリーページ
	} else if ( is_category() ) {
	$cat = get_queried_object();
	$cat_id = $cat->parent;
	$cat_list = array();
	while($cat_id != 0) {
	  $cat = get_category( $cat_id );
	  $cat_link = get_category_link( $cat_id );
	  array_unshift( $cat_list, '<li><a href="'.$cat_link.'">'.$cat->name.'</a></li>' );
	  $cat_id = $cat->parent;
	}
	echo $home;
	foreach ($cat_list as $value) {
	  echo $value;
	}
	the_archive_title('<li>', '</li>');
  
	// アーカイブページ
	} else if ( is_archive() ) {
	echo $home;
	the_archive_title('<li>', '</li>');
  
	// 投稿ページ
	} else if ( is_single() ) {
	$cat = get_the_category();
	if( isset( $cat[0]->cat_ID ) ) $cat_id = $cat[0]->cat_ID;
	$cat_list = array();
	while( $cat_id != 0 ) {
	  $cat = get_category( $cat_id );
	  $cat_link = get_category_link( $cat_id );
	  array_unshift( $cat_list, '<li><a href="'.$cat_link.'">'.$cat->name.'</a></li>' );
	  $cat_id = $cat->parent;
	}
	echo $home;
	foreach($cat_list as $value) {
	  echo $value;
	}
	the_title('<li>', '</li>');
  
	// 固定ページ
	} else if ( is_page() ) {
	echo $home;
	the_title('<li>', '</li>');
  
	// 検索結果
	} else if ( is_search() ) {
	echo $home;
	echo '<li>「'.get_search_query().'」の検索結果</li>';
  
	// 404ページ
	} else if ( is_404() ) {
	echo $home;
	echo '<li>ページが見つかりません</li>';
	}
	echo '</ul>';
  }

コードの説明はコード内のコメントをご覧ください。
ページごとでパンくずリストの表示は違います。(例:トップページ場合はパンくずリストを表示する必要がありません、カテゴリーページの場合、アーカイブページ、投稿ページなどで表示する内容は違います。)
以下にfunctions.phpに追記したコードの解説をコメントに入れていますのでご覧ください。

// パンくずリスト
function output_breadcrumb(){
	$home = '<li><a href="'.get_bloginfo('url').'">トップ</a></li>';//トップページへのリンクを取得しトップの文字列にリンク付け
	echo '<ul class="breadcrumb">';
  
	// トップページ
	if ( is_front_page() ) {//トップページであれば
    //何も表示せず終わる
	// カテゴリーページ
	} else if ( is_category() ) {//カテゴリーページが表示されていれば
	$cat = get_queried_object();//現在表示されているカテゴリのオブジェクトを取得(現在表示されているものの情報取得)    
	$cat_id = $cat->parent;//カテゴリIDを取得
	$cat_list = array();
	while($cat_id != 0) {
	  $cat = get_category( $cat_id );
	  $cat_link = get_category_link( $cat_id );
	  array_unshift( $cat_list, '<li><a href="'.$cat_link.'">'.$cat->name.'</a></li>' );
	  $cat_id = $cat->parent;
	}
	echo $home;//トップを表示
	foreach ($cat_list as $value) {
	  echo $value;
	}
	the_archive_title('<li>', '</li>');//現在表示されているカテゴリーをliタグで囲んで出力
  
	// アーカイブページ
	} else if ( is_archive() ) {//アーカイブページならば
	echo $home;//トップを表示
	the_archive_title('<li>', '</li>');//アーカイブ名を表示
  
	// 投稿ページ
	} else if ( is_single() ) {//投稿ページであれば
	$cat = get_the_category();//現在の投稿のカテゴリ名を取得
	if( isset( $cat[0]->cat_ID ) ) $cat_id = $cat[0]->cat_ID;
	$cat_list = array();
	while( $cat_id != 0 ) {
	  $cat = get_category( $cat_id );
	  $cat_link = get_category_link( $cat_id );
	  array_unshift( $cat_list, '<li><a href="'.$cat_link.'">'.$cat->name.'</a></li>' );
	  $cat_id = $cat->parent;
	}
	echo $home;//トップを表示
	foreach($cat_list as $value) {
	  echo $value;//カテゴリ名を表示
	}
	the_title('<li>', '</li>');//現在表示されている記事のタイトル表示
  
	// 固定ページ
	} else if ( is_page() ) {//固定ページであれば
	echo $home;//トップを表示
	the_title('<li>', '</li>');//現在表示されている固定ページのタイトル表示
  
	// 検索結果
	} else if ( is_search() ) {//検索結果ページであれば
	echo $home;//トップを出力
	echo '<li>「'.get_search_query().'」の検索結果</li>';//サイト内検索を行ったときのクエリ文字列を表示
  
	// 404ページ
	} else if ( is_404() ) {//404ページ(ページが見つからないです)であれば
	echo $home;//トップを表示
	echo '<li>ページが見つかりません</li>';
	}
	echo '</ul>';
  }

コード量は多く見えますが、各ページにより表示が変わるようにif文を書いておりますので適応されるコードは一部分になります。

追記したコードの続き

●9行目〜11行目(single.phpに追記した部分)

while ( have_posts() ) : the_post();
  get_template_part( 'template-parts/content-post');
endwhile;

記事があれば、while文でループを回し「get_template_part(テンプレートファイルを呼び出す関数)」でtemplate-partsディレクトリ内のcontent-post.phpを表示させています。
content-post.phpへの記述はこの後行います。

表示確認

single.phpへの追記が終わったところで一度表示の確認をしてみましょう。
single.phpは投稿ページを表示するファイルですのでトップページからどれでも好きな投稿記事をクリックした先がsingle.phpが表示するページになります。(固定ページとはファイルが異なりますので、固定ページの記事をクリックしても確認できませんので注意)
以下が現在の表示になります。

single.phpのみに追記を行った段階のサイトの表示

見事パンくずリストが表示されています。
がしかし、肝心の記事が表示されていません。
それは、get_template_partでcontent-post.phpを呼び出して表示する予定ですが、現在content-post.phpが存在しないからです。
では次に、コンテンツ部分の出力をするcontent-post.phpを作成しコードを書いていきます。

content-post.phpファイルを作成しコンテンツ部分のコードを記述する

ここでは、single.php内の「get_template_part( ‘template-parts/content-post’);」で呼び出されるcotent-post.phpを作成し、コードを書いていきます。

conetnt-post.phpファイルを作成

content-post.phpファイルは_s(underscires)テーマファイル内の「template-parts」ディレクトリ内に設置します。
(違う場所に設置するとsingle.phpのget_template_part関数で定義したパスと合致しいない為、ファイルを呼び出すことができません。)

content-post.phpにコードを書く

上記で作成したcontent-post.phpファイルに以下のコードを追記します。

<article class="singler">
    <?php if(has_post_thumbnail()): ?>
    <div class="post-Eye-Catch">
        <img src="<?php the_post_thumbnail_url(); ?>">
    </div>
    <?php endif; ?>
    <div class="content-ttl">
        <h1><?php the_title(); ?></h1>
    </div>
    <div class="content-body">
        <div class="blog-content"><?php echo the_content(); ?></div>
    </div>
</article>

content-post.phpに追記した部分の解説

上記でcontent-post.phpに追記したコードの解説は以下のコード内のコメントをご覧ください。

<article class="singler">
    <?php if(has_post_thumbnail()): ?>//投稿のサムネイルが設定されていれば
    <div class="post-Eye-Catch">
        <img src="<?php the_post_thumbnail_url(); ?>">//アイキャッチを表示
    </div>
    <?php endif; ?>//if文終了
    <div class="content-ttl">
        <h1><?php the_title(); ?></h1>//投稿記事のタイトルを表示
    </div>
    <div class="content-body">
        <div class="blog-content"><?php echo the_content(); ?></div>//投稿記事の内容を出力(記事出力)
    </div>
</article>

表示の確認

single.php、content-post.phpの記述が完了しました。
最後にサイトを表示して動作確認をしたいと思います。
以下の様になっていれば完璧です。

single.php、content-post.php編集後のサイトの表示

うまく表示されましたか?
上の画像のように表示されていればOKです!

最後に

以上で投稿ページ制作は終了です!!
お疲れ様でした!!

ヘッダー、サイドバー、フッターの作成が前回の「トップページを作ろう」で終了していることでコンテンツ部分のみの作成で投稿ページを作ることができました。
次回は固定ページを作成したいと思います。
最後まで読んでいただきありがとうございました。
ではまた次の記事でお会いしましょう!!

Nino-BLOGのサービス紹介

実績100件以上!集客できるホームページ制作します SEO対策とデザインで集客力UP!更新可能なホームページを!
Wordpressの修正・カスタマイズを代行します 画像や文章の追加・修正・ページの追加・アップデートなど
wordpress テーマ作り
二宮 旬平
WEBデザイナー
はじめましてWEBデザイナーの二宮と申します。
このサイトでは、Wordpressについて実際に手を動かしながら学べるよう日々投稿を行なっております。
HP制作実績はこちらから
キーワード検索
人気記事
  • 【完全解説】WordPressでヘッダーを自作してみよう!(コーポレートサイト編)
    5387
  • 【コピペOK】ContactFrom7でお問い合わせフォームを設置する方法
    5071
  • 【超簡単】ContactForm7でお問い合わせ確認画面を設置してみよう
    4250
  • 【自作テーマ開発】_s(underscores)でオリジナルブログサイトを作ろう!
    2377
  • 【WordPress自作テーマ開発③】トップページを作ろう
    2292
カテゴリー
  • SEO対策
  • wordpress
    • テーマ作り
  • カスタマイズ
  • ニュース
  • ライティング
  • ライフハック
  • 副業
  • 未分類
  • 資格
アーカイブ
  • 2023年7月 (3)
  • 2023年2月 (3)
  • 2022年4月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 2021年10月 (1)
  • 2021年9月 (3)
  • 2021年8月 (8)
  • 2021年7月 (2)
  • 2021年2月 (9)
  • 2021年1月 (5)
↓Nino-blogのサービス紹介
実績100件以上!集客できるホームページ制作します SEO対策とデザインで集客力UP!更新可能なホームページを!
目次
  • HOME
  • プライバシーポリシー
  • 免責事項
  • お問い合わせ

© 2020 nino-blog

目次