以前の記事で、WordPressのプラグイン「Advanced Custom Fields」(以下、ACF)を使用して、都道府県別のショップ一覧ページを作成する方法をご紹介しました。
「WordPressのカスタムフィールドの値で、都道府県別一覧ページを作成する方法」
そのACFプラグインですが、2024年10月にWordPress運営会社Automatticと、ACFの管理者であるWP Engineとの間に対立が発生し、プラグインの使用に懸念が生じました。
※詳細については、こちらの記事をご参照ください。
「ACFがSCFに変更された背景と影響をまとめました」
WordPressは多機能で便利な一方、セキュリティ面やプラグインのサポート終了といった懸念もあります。
「便利さ、手軽さを求めてWordPressでのサイト運用を選択したはずが、逆に苦労していないですか?」
そこで今回は、WordPressやプラグインに頼らず、PHPのみで都道府県別のショップ一覧・詳細ページを動的に表示するプログラムを作成する方法をご紹介します。
目次
作成するファイル
作成するファイルは以下3つです。
・ショップデータ(store-db.php): ショップ情報を管理するファイル
・ショップ一覧ページ(store.php): 都道府県ごとに分類したショップのリストを表示
・ショップ詳細ページ(store-detail.php): 各ショップの詳細情報を表示
ショップデータ(store-db.php)
まず、ショップ情報を管理するためのファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $stores = array( array('id' => 1, 'name' => '本店', 'category' => '群馬県', 'postal' => '371-0844', 'address' => '群馬県前橋市古市町553番地', 'description' => '株式会社ネディアです。'), array('id' => 2, 'name' => '新前橋店', 'category' => '群馬県', 'postal' => '371-0843', 'address' => '群馬県前橋市新前橋町', 'description' => ''), array('id' => 3, 'name' => '鳥羽町店', 'category' => '群馬県', 'postal' => '371-0845', 'address' => '群馬県前橋市鳥羽町', 'description' => ''), array('id' => 4, 'name' => '宇都宮店', 'category' => '栃木県', 'postal' => '329-1113', 'address' => '栃木県宇都宮市相野沢町', 'description' => ''), array('id' => 5, 'name' => 'さいたま店', 'category' => '埼玉県', 'postal' => '330-0841', 'address' => '埼玉県さいたま市大宮区東町', 'description' => ''), array('id' => 6, 'name' => '札幌店', 'category' => '北海道', 'postal' => '064-0941', 'address' => '北海道札幌市中央区旭ケ丘', 'description' => ''), ); ?> |
各ショップのidは必ずユニークな値に設定します。
ショップ一覧ページ(store.php)
続いて、ショップ情報を都道府県別に分類し、リストを動的に生成するページを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php // ショップデータの読み込み require_once 'store-db.php'; // 都道府県番号対応表 $prefecture_numbers = array( '北海道' => 1, '青森県' => 2, '岩手県' => 3, '宮城県' => 4, '秋田県' => 5, '山形県' => 6, '福島県' => 7, '茨城県' => 8, '栃木県' => 9, '群馬県' => 10, '埼玉県' => 11, '千葉県' => 12, '東京都' => 13, '神奈川県' => 14, '新潟県' => 15, '富山県' => 16, '石川県' => 17, '福井県' => 18, '山梨県' => 19, '長野県' => 20, '岐阜県' => 21, '静岡県' => 22, '愛知県' => 23, '三重県' => 24, '滋賀県' => 25, '京都府' => 26, '大阪府' => 27, '兵庫県' => 28, '奈良県' => 29, '和歌山県' => 30, '鳥取県' => 31, '島根県' => 32, '岡山県' => 33, '広島県' => 34, '山口県' => 35, '徳島県' => 36, '香川県' => 37, '愛媛県' => 38, '高知県' => 39, '福岡県' => 40, '佐賀県' => 41, '長崎県' => 42, '熊本県' => 43, '大分県' => 44, '宮崎県' => 45, '鹿児島県' => 46, '沖縄県' => 47 ); // 県別にショップを分類 $stores_by_prefecture = []; foreach ($stores as $store) { $prefecture = $store['category']; if (!isset($stores_by_prefecture[$prefecture])) { $stores_by_prefecture[$prefecture] = []; } $stores_by_prefecture[$prefecture][] = $store; } // 都道府県番号順に並び替え uksort($stores_by_prefecture, function ($a, $b) use ($prefecture_numbers) { return $prefecture_numbers[$a] <=> $prefecture_numbers[$b]; }); // 各都道府県内のショップを郵便番号順に並び替え foreach ($stores_by_prefecture as $prefecture => &$stores) { usort($stores, function ($a, $b) { return strcmp($a['postal'], $b['postal']); }); } unset($stores); // 参照を解除 ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>都道府県別ショップ一覧</title> </head> <body> <main> <h1>都道府県別ショップ一覧</h1> <ul> <?php foreach ($stores_by_prefecture as $prefecture => $stores): ?> <li> <h2><?php echo htmlspecialchars($prefecture); ?></h2> <table> <?php foreach ($stores as $store): ?> <tr> <th class="name"> <a href="store-detail.php?id=<?php echo $store['id']; ?>"><?php echo htmlspecialchars($store['name']); ?></a> </th> <td class="address"> 〒<?php echo htmlspecialchars($store['postal']); ?> <?php echo htmlspecialchars($store['address']); ?> </td> </tr> <?php endforeach; ?> </table> </li> <?php endforeach; ?> </ul> </main> </body> </html> |
都道府県番号順に表示し、さらに各都道府県内で郵便番号順に並び替えています。
ショップ名をクリックすると詳細ページに遷移します。
ショップ詳細ページ(store-detail.php)
各ショップの詳細情報を表示するページを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php // ショップデータの読み込み require_once 'store-db.php'; // URL パラメータからショップIDを取得 $store_id = isset($_GET['id']) ? (int)$_GET['id'] : null; // 該当するショップを検索 $store = null; foreach ($stores as $s) { if ($s['id'] === $store_id) { $store = $s; break; } } if (!$store) { // ショップが見つからない場合のエラーメッセージ echo "<h1>ショップが見つかりません</h1>"; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title><?php echo htmlspecialchars($store['name']); ?> の詳細</title> </head> <body> <main> <h1><?php echo htmlspecialchars($store['name']); ?></h1> <p><?php echo htmlspecialchars($store['description']); ?></p> <dl> <div> <dt>ショップ名</dt> <dd><?php echo htmlspecialchars($store['name']); ?></dd> </div> <div> <dt>住所</dt> <dd>〒<?php echo htmlspecialchars($store['postal']); ?><br> <?php echo htmlspecialchars($store['address']); ?></dd> </div> </dl> <a href="store.php">一覧に戻る</a> </main> </body> </html> |
表示確認
ショップ一覧ページ
ショップ詳細ページ
これでショップ一覧・詳細ページを動的に表示するPHPプログラムが作成できました。
まとめ
今回は、PHPのみを使用してショップ一覧・詳細ページを動的に表示する方法をご紹介しました。
WordPressは便利なツールですが、セキュリティ面やプラグインのサポート終了のリスクを考えると、シンプルなPHPプログラムによる運用も有効な選択肢です。
弊社ネディアではサイト制作や保守管理サービスを行っています。
分からない、上手くいかないなどがございましたら代行いたしますのでご連絡ください。
他にもサーバ・ネットワーク保守なども行っておりますので、ネットワークのことなら全てネディアにおまかせください。