Portfolio作成 ② 記事一覧と記事ページ編

キミマチラボ

目的

今回の作業目的は以下です。

  • index.php ファイル作成
  • PHPコード記述
  • ファイル保存
  • ブラウザで /portfolio アクセス確認
  • PHP実行確認

1-1 index.php ファイル作成

Portfolio作成 ①にて /portfolio アクセス確認 の際に適当に作成したとお伝えしたこのページは

ファイル管理内の

/自分のドメイン/public_html/portfolio/index.php

へ記述したページです。

しかし、開発においてすべて index.php へ記述するのは健全ではありません。

なので、 /portfolio/index.php を含め、以下を作成します。

portfolio/
├── index.php
├── header.php
├── footer.php
├── style.css

目標

WordPressテーマのように共通部分を分離する。

作成完了!

1-2 PHPコード記述

順を追って、確認していくために一旦 index.php の中身を真っ新にして

index.php

<?php include 'header.php'; ?>

<h2>記事一覧</h2>

<?php include 'footer.php'; ?>

header.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>キミマチラボCMS</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>キミマチラボCMS</h1>
</header>

footer.php

<footer>
<p>© KimimachiLab</p>
</footer>
</body>
</html>

それぞれ表示されているか確認

問題なく、認識されていますね。

1-3 さらにファイル分割

学習という面では、再現することを優先してこのまま書き込んでいくのも、まず慣れるという意味で問題ないと思います。

ですが、現実的な環境構築として「データ」と「表示」を分ける考え方 を学ぶのが重要です。

WordPressを再現する学習としては、早い段階で分離してみましょう。

portfolio/
├── index.php
├── post.php
├── header.php
├── footer.php
├── style.css
└── data/
    └── posts.php

post.php」ファイル と「data」フォルダ を作成

data」フォルダ配下に「posts.php」ファイルを作成

data/posts.php → データ置き場(データ

index.php → 一覧表示(表示

post.php → 詳細表示(表示

さらに将来的に

data/posts.php → MySQL(データ

へ置き換えるだけで済みます。

実際のWordPressでも、

MySQL

PHP配列

画面表示

という流れで動いています。

1-4 ディレクトリに合わせたコード記述

data/posts.php

<?php

$posts = [
    [
        'id' => 1,
        'title' => '最初の記事',
        'content' => 'CMS開発開始'
    ],
    [
        'id' => 2,
        'title' => 'PHP学習',
        'content' => '配列を使ってみる'
    ]
];

index.php

<?php

include 'data/posts.php';
include 'header.php';

?>

<h2>記事一覧</h2>

<?php foreach($posts as $post): ?>

    <h3>
        <?php echo $post['title']; ?>
    </h3>

<?php endforeach; ?>

<?php include 'footer.php'; ?>

これを記述することで

おぉ!

記事一覧(index.php)に「data/posts.php」へ書き込んだ記事タイトルが認識されていますね。

記事詳細ページ(post.php

次は 記事詳細ページ(post.php)です。

目指す形は、一覧の記事タイトルをクリックすると、記事詳細ページへ遷移して、

記事タイトル
記事本文

を表示する状態です。

index.php修正

<h3><?php echo $post['title']; ?></h3>

この部分を

<h3>
    <a href="post.php?id=<?php echo $post['id']; ?>">
        <?php echo $post['title']; ?>
    </a>
</h3>

に変更。

post.php

<?php

include 'data/posts.php';

?>

を記述。

そこへ、URLのID取得のため

$id = $_GET['id'];

を追加して

<?php

include 'data/posts.php';

$id = $_GET['id'];

?>

の形へ。

URLのID取得について認識を共有すると

kimimachilab.com/portfolio/post.php?id=2

というURLなら$idには2が入ります。

data/posts.php

<?php

$posts = [
    [
        'id' => 1,
        'title' => '最初の記事',
        'content' => 'CMS開発開始'
    ],
    [
        'id' => 2,
        'title' => 'PHP学習',
        'content' => '配列を使ってみる'
    ]
];

へ記述している通り、id=2を指定すれば、

PHP学習

配列を使ってみる

が表示されるということです。

さらに、対象記事を探す

$targetPost = null;

foreach ($posts as $post) {

    if ($post['id'] == $id) {
        $targetPost = $post;
        break;
    }

}

も追加で記述。

<?php

include 'data/posts.php';

$id = $_GET['id'] ?? null;

$targetPost = null;

foreach ($posts as $post) {

    if ($post['id'] == $id) {
        $targetPost = $post;
        break;
    }

}

の形へ。

さらにさらに、記事詳細ページ(post.php)の表示指定を追加して

<?php include 'header.php'; ?>

<h2><?php echo $targetPost['title']; ?></h2>

<p>
    <?php echo $targetPost['content']; ?>
</p>

<?php include 'footer.php'; ?>

post.php(完成版)

<?php

include 'data/posts.php';

$id = $_GET['id'] ?? null;

$targetPost = null;

foreach ($posts as $post) {

    if ($post['id'] == $id) {
        $targetPost = $post;
        break;
    }

}

?>

<?php include 'header.php'; ?>

<h2><?php echo $targetPost['title']; ?></h2>

<p>
    <?php echo $targetPost['content']; ?>
</p>

<?php include 'footer.php'; ?>

段階を経て、盛っていきましたが一旦の形になったのでは? 確認♪確認♪

おー!

リンク化されてるー!

それぞれクリックしてみると・・・

きちんと、記事詳細ページ(post.php)が表示され、指定されている記事タイトルや記事本文(data/posts.php)が読み込まれています!

補足

途中でサラッと

$id = $_GET['id'];

から

$id = $_GET['id'] ?? null;

へ書き換えられていますが、これは安全上の処置です。

もし、データ(data/posts.php)で指定されていないidへアクセスした場合、もちろん$_GET['id']は存在しません。

その場合

Undefined array key "id"

(未定義の配列キー「id」)というエラーが出ることがあります。

そこで、

$id = $_GET['id'] ?? null;

と書くと

  • ?id=1$id = 1
  • ?id=2$id = 2
  • ?id が無い → $id = null

となり、未定義ではなくなるので安全です。

最後に

ここまで読んでいただき、ありがとうございます。

まだまだ、サイトの体を成していない段階ですが、構造として形になっていっている感覚があり、とてもワクワクしますね。

現段階は、記事一覧と記事ページができた状態です。

次は、管理画面の作成です。

CMS = 管理画面でデータを管理するシステム なので、ここからより本質へ進んでいきます。

次回の記事も、よろしくお願いいたします。

\ 最新情報をチェック /

コメントを残す

※ が付いている項目は必須です

CAPTCHA