Bloggerテンプレート自作 #10:個別記事ページを作る

前回の「記事リスト用のページャを作る」に引き続き、今回は「個別記事ページを作る」を実践してみようと思う。

個別記事ページとは投稿記事が全文表示されるページを指し、Bloggerのページタイプでは item に該当するもの。このページには「記事タイトル」「公開日・タグ」「本文」「SNSボタン」「ページャ」「関連記事」「コメント」が設置される予定。

とりあえず、今回は「個別記事の読み込み」と「記事タイトル」「公開日・タグ」「本文」が表示されるまでの作業工程をまとめていくことにする。


作業工程


個別記事を読み込ませる


HTML


<!-- ページタイプの条件分岐 -->
<b:switch var='data:blog.pageType'>
  <!-- 個別記事の時 -->
  <b:case value="item" />

  <b:loop var='post' values='data:posts'>
    <b:include name='single-post' />
  </b:loop>

  <!-- 固定ページの時 -->
  <b:case value="static_page" />
  <div>固定ページ</div>
  <!-- それ以外 -->
  <b:default />
  <b:loop var='post' values='data:posts'>
    <b:include name='articles' />
  </b:loop>
  <b:include name='articles-pager' />
</b:switch>
</b:includable>

メインのページタイプの条件分岐にて <b:case value="item" /> 以下に <b:loop var='post' values='data:posts'> <!-- 個別記事ページを呼び出す処理 --> </b:loop> を記述すると記事を個別に読み込むことができる。

ちなみに、ここの <b:loop> は投稿記事の有無を判別して取り出す処理になっているようで、このループ処理をかけないと何も表示してくれないので注意。

個別記事ページを作る


HTML


<!-- 個別記事ページ -->
<b:includable id='single-post'>
  <div class="post-area">
    <h1>
      <data:post.title />
    </h1>
    <!-- 公開日・最終更新日・タグを表示するエリア -->
    <div class="single-info-area">
      <!-- 公開日 -->
      <div class="single-release-date">
        <i class="fa fa-edit fa-fw post-icon"></i><data:post.date />
      </div>
      <!-- 最終更新日 -->
      <div class='updated single-modified-date' id="last-modified" itemprop='dateModified' expr:title='"Post was updated on " + data:post.lastUpdatedISO8601'><data:post.lastupdatedISO8601/></div>

      <!-- お借りした最終更新日取得用のスクリプトコードを記述 -->

      <!-- タグ -->
      <div class="single-post-tag">
        <b:if cond='data:post.labels'>
          <i class="fa fa-tag" aria-hidden="true"></i>
          <b:loop values='data:post.labels' var='label'>
           <a expr:href='data:label.url + &quot;?&amp;max-results=10&quot;' property='v:title' rel='v:url'>
           <data:label.name /></a>
          </b:loop>
          <b:else />
        </b:if>
      </div>
    </div>
    <!-- 記事の本文を表示するエリア -->
    <div class="post-content">
      <data:post.body />
    </div>
  </div>
</b:includable>

上記が記事ページを構成するコードとなる。

構成は上から「記事タイトル」「公開日・最終更新日・タグ」「本文」といった形に並んでいる。最終更新日はversion2でなければ呼び出せるタグが使えないのでJavaScriptを使って取得する。この最終更新日を取得するJavaScriptコードは下記のサイトからお借りすることにした。


とりあえず、コード全文はこの記事には載せないので、お借りさせていただいたサイトから参照してほしい。このテンプレートでは、お借りしたコードの冒頭のコードを上記のように書き換えており、その下にサイトで紹介されている <script> 以下を貼り付ければ使えるようになっている。

また、このテンプレートでは<script>内のコードの

var updated_dd ="最終更新日:"+ dd_Y+"年"+dd_M+"月"+dd_D+"日";



var updated_dd ='<div class="last-modified"><i aria-hidden="true" class="fas fa-sync-alt fa-fw post-icon"></i>'+dd_Y+"/"+dd_M+"/"+dd_D+'</div>';

というふうに書き換えて、CSSで内容を書き換えられるようにしている。

CSS


Bloggerテンプレート自作 #10:個別記事ページを作る
個別記事イメージ(コード変更前)

/* ----------------------------------------------------------------------------
コンテンツ共通部分
---------------------------------------------------------------------------- */

/* 記事全体 */

.post-area {
  background: #fff;
  padding-bottom: 20px;
  max-width: 800px;
}

/* 画像 */

.post-area img {
  border: solid 1px #ddd;
  object-fit: cover;
}

/* 記事タイトル */

.post-area h1 {
  background: #333;
  color: #fff;
  font-size: 24px;
  letter-spacing: 2px;
  padding: 15px 20px;
  margin: 0;
}

/* 見出し */

.post-area h2 {
  border-left: solid 4px #333;
  background: #f5f5f5;
  color: #333;
  font-size: 20px;
  padding: 10px;
  margin: 0;
}

.post-area h3 {
  border-left: solid 4px #333;
  border-bottom: solid 1px #333;
  font-size: 18px;
  color: #333;
  padding: 6px 10px;
  margin: 0;
}

.post-area h4 {
  border-left: solid 4px #333;
  font-size: 16px;
  color: #333;
  padding: 3px 10px;
  margin: 0;
}

.post-area h5 {
  color: #333;
  margin: 0;
}

.post-area h6 {
  color: #333;
  margin: 0;
}

/* コンテンツ */

.post-content {
  font-size: 14px;
  color: #333;
  letter-spacing: 2px;
  line-height: 1.8em;
  padding: 10px 20px;
  overflow: hidden;
}

/* 段落設定 */

.post-content p {
  padding: 0 15px;
}

/* リンク設定 */

.post-content a {
  text-decoration: none;
  padding: 2px;
}

.post-content a:hover {
  opacity: 0.6;
}

/* 引用文 */

blockquote {
  position: relative;
  background: #fafafa;
  padding: 30px;
  margin: 10px 15px;
}

blockquote::before {
  position: absolute;
  top: 5px;
  left: 5px;
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
  content: "\f10d";
  font-size: 18px;
  color: #ddd;
}

blockquote::after {
  position: absolute;
  right: 5px;
  bottom: 5px;
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
  content: "\f10e";
  font-size: 18px;
  color: #ddd;
}

blockquote p {
  padding: 0;
  margin: 0;
}

/* リスト */

.post-area ul li {
  margin-left: 30px;
}

.post-area ul {
  padding-left: 0;
  margin-left: 1.5em;
}

/* 番号付きリスト */

.post-area ol li {
  margin-left: 30px;
  padding: 0;
}

.post-area ol {
  padding-left: 0;
  margin-left: 1.8em;
}

/* テーブル */

table {
  margin: 0 auto;
}

table, th, td {
  border: solid 1px #999;
}

th, td {
  padding: 5px;
}

th {
  background: #fafafa;
}

/* レスポンシブ(タブレット縦) */

@media screen and (max-width: 960px) {
  .post-content {
    padding: 30px 15px 0;
  }
  .post-area img {
    height: auto;
    max-width: 95%;
  }
  .separator {
    height: auto;
    max-width: 95%;
  }
}

/* レスポンシブ(スマホ縦) */

@media screen and (max-width: 560px) {
  .post-area h1 {
    font-size: 18px;
    padding: 10px 15px;
  }
  .post-area h2 {
    font-size: 16px;
  }
  .post-area h3 {
    font-size: 15px;
  }
  .post-area h4 {
    font-size: 14px;
  }
  .post-content {
    font-size: 13px;
  }
  .post-area ul li {
    margin-left: 15px;
  }
  .post-area ol li {
    margin-left: 15px;
  }
  blockquote {
    padding: 15px 25px;
    margin: 10px 0;
  }
  blockquote::before, blockquote::after {
    font-size: 14px;
  }
}

/* ----------------------------------------------------------------------------
個別記事ページ
---------------------------------------------------------------------------- */

/* 公開日・最終更新日・タグ */

.single-info-area {
  display: flex;
  flex-wrap: wrap;
  background: #fbfbfb;
  border-bottom: dashed 1px #eee;
  color: #888;
  font-size: 12px;
  padding: 10px 20px 8px 20px;
  margin-bottom: 15px;
}

/* 公開日 */

.single-release-date {
  margin-right: 15px;
  padding: 2px 0 4px 0;
}

/* 最終更新日 */

.single-modified-date {
  padding: 2px 0 4px 0;
}

.last-modified {
  margin-right: 15px;
}

/* タグ */

.single-post-tag {
  padding: 2px 0 4px 0;
}

.single-post-tag a {
  text-decoration: none;
  color: #888;
  padding: 2px;
}

.single-post-tag a:hover {
  background: #dfdfdf;
  opacity: 0.6;
}

/* アイコン */

.post-icon {
  margin-right: 5px;
}

/* レスポンシブ(スマホ縦) */

@media screen and (max-width: 560px) {
  .single-info-area {
    padding: 10px 10px 8px 10px;
    margin-bottom: 0;
  }
}

CSSは上記のようになっており、これで画像のようなページを表示することができる。

共通部分は固定ページなどでも使うので、共通部分とした。

画像は記事作成当初のもので、その後にコードをやや変更したので上のコードは画像の見た目とは若干異なる。