Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WordCamp Kansai 2025 LT スライド

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for あかし あかし
November 02, 2025
520

WordCamp Kansai 2025 LT スライド

WordCamp Kansai 2025 LTのスライドです。

Avatar for あかし

あかし

November 02, 2025

Transcript

  1. 自己紹介 明石荘作 x:cheekydigit ITエンジニアしつつ行政書士やっています • Vue,React などのモダンフロントエンド • Laravel,Node.jsなどのバックエンド •

    その他Webシステム開発 • 業務システム開発 • 技術的観点からの法務支援 ◦ スコレーデジタル行政書士事務所
  2. ディレクトリ構成 your-theme/ ├─ inc/ │ ├─ news_presenters.php #ピュアPHPでHTMLに整形する(テスト対象) │ └─

    news-card.php # HTMLデータを注入する(データ取得関数WP依存) ├─ template-parts/ │ └─ news-list.php # WPのテンプレートそのもの └─ tests/ └─ NewsPresentersTest.php
  3. 表示に関する処理をプレーン PHPに切り出す news_presenters.php 入力:表示するための値を配列にする (全て文字列の配列) 出力:記事カード1枚分のHTML文字列を返す /** ニュースカード1枚分のHTML生成(プレーンPHP) */ function

    build_news_card(array $data): string { $title = h($data['title'] ?? ''); // 略 return <<<HTML <div class="card__body"> <h3 class="card__title" itemprop="headline">{$title}</a></h3> //略 </div> HTML; }
  4. news_presenters.php(プレーンPHP)のテストコード <?php use PHPUnit\Framework\TestCase; use MyTheme\NewsPresenters as P; require_once __DIR__.'/../your-theme/inc/news_presenters.php';

    class NewsPresentersTest extends TestCase { public function test_build_news_card_contains_core_parts() { $html = P\build_news_card([ 'title'=>'','permalink'=>'https://ex.com/p','date_iso'=>'2025-09-12', // 省略 ]); // データの有無で表示項目が変わるかのテストなど $this->assertStringContainsString('news-card', $html); $this->assertStringContainsString('<img', $html); } }
  5. 入力:記事id 処理: 記事IDを元にデータを取得して、表示の PHPに渡す news-list.php WordPressから集めた値をまとめてプレーン PHPに渡す処理 <?php namespace MyTheme\NewsTags; require_once

    __DIR__.'/news_presenters.php'; use MyTheme\NewsPresenters as P; /** post_idを元にWPから値を集める。HTMLにするのは全部ヘルパーへ委譲 */ function news_card($post_id = null): void { $content = get_post_field('post_content', $post_id) ?: ''; // 省略  $html = P\build_news_card([ 'title' => get_the_title($post_id), 'date_iso' => get_the_date('Y-m-d', $post_id), // 省略 ]); echo wp_kses_post($html); // 出力直前だけエスケープ }
  6. 処理: 対象のカードを出力する カードを一覧表示するテンプレート <?php use MyTheme\NewsTags; // カードを出したい投稿を絞り込む $q =

    new WP_Query([ 'category_name' => 'news', (中略) ]); if ($q->have_posts()): echo '<div class="news-list">'; while ($q->have_posts()): $q->the_post(); NewsTags\news_card(); // 値を集めて渡すだけ endwhile; echo '</div>'; wp_reset_postdata(); else: echo '<p>ニュースはありません。</p>'; endif;
  7. テスト可能設計 (関心の分離 )の使い所 1. クラシックテーマからブロックテーマへの移行を安全に行いたい 時 a. 後方互換性も確保できそう 2. WordPressのバージョンアップ対応

    3. ロケールで表示形式が違う。それぞれで確認したい時 など プロンプトに「関心の分離」「単体テスト」と入れれ ば、LLMがいろいろ提案してくれます !