チャリティ組織やNPO法人のWeb基盤構築における最大の技術的失敗は、寄付決済や緊急支援のトラフィックを処理するシステムと、日々の活動報告や情報開示を行うコンテンツ管理層を無秩序に密結合させてしまうことです。結果として、寄付キャンペーンのピーク時にサーバーがダウンし、寄付完了メールが迷惑メールに分類され、活動の透明性を担保するデータが埋没します。

Free Download: Leud – Charity & Donation Bootstrap 5 Template


1. 垂直業界における技術的責任分界点とコア要件

非営利セクター(NPO/NGO、慈善団体、緊急災害支援)のWebサイトは、一般的なECサイトとは異なる固有の技術要件を抱えています。寄付者の信頼を獲得するための「資金使途の透明性開示」、災害発生時における「突発的なアクセス集中(スパイク)への耐性」、そしてボランティア応募や大口寄付の商談を逃さない「確実なリード獲得パイプライン」が求められます。

この目的を達成するためには、アーキテクチャの責任分界点を厳密に定義する必要があります。

  • WordPress+フロントエンド層(情報公開・共感獲得・リード一次受け):活動レポート、プロジェクト(Causes)の進捗可視化、アニュアルレポートの公開、寄付意思の取得、ボランティア応募フォームの処理。Core Web Vitalsの最適化(LCP、CLSの極小化)と検索エンジンに対する完全なセマンティック構造化データの提供に特化させます。

  • 決済・基幹台帳層(PCI-DSS準拠・決済代行・財務会計):クレジットカード番号や銀行口座情報を直接WordPressのデータベースに保存することは厳禁です。決済処理はStripeやPayPalなどの外部セキュアエレメントおよびWebhooksを介して独立処理し、基幹台帳やCRM(Salesforce for Nonprofits、HubSpot等)へ非同期で連携します。

codeCode

+---------------------------------------------------------------------------------------+
|                    エンドユーザー:一般寄付者 / 助成金審査員 / ボランティア応募者              |
+-------------------------------------------+-------------------------------------------+
                                            |
                    +-----------------------+-----------------------+
                    |                                               |
                    v (活動閲覧 / 進捗確認 / 寄付意図)                  v (カード決済 / 継続課金処理)
+---------------------------------------------+   +-------------------------------------+
|        WordPress 商用ポータル層               |   |       決済代行・外部CRM基幹層         |
| - Leud (Bootstrap 5) 高速レンダリング       |   | - PCI-DSS準拠トークン決済 (Stripe)  |
| - カスタム投稿 (Causes / Annual Reports)    |   | - 継続寄付サブスクリプションエンジン |
| - 資金使途・進捗バー表示 (キャッシュ分離)   |   | - 寄付領収書・税控除データ生成      |
| - 非同期リード・ボランティア中継ゲートウェイ |   | - NPO専用CRM (Salesforce/HubSpot)   |
+---------------------+-----------------------+   +------------------+------------------+
                      |                                              |
                      +-------------[ 暗号化Webhook / API ]-----------+
                              (決済完了通知・ステータス同期)

2. 選定機能マトリクス比較(汎用テーマのパッチワーク vs 専門UIフレームワーク設計)

多くの組織が汎用多目的テーマに重厚なページビルダーを重ね、機能プラグインを乱立させた結果、サイトの肥大化と表示遅延を引き起こしています。Bootstrap 5ベースのクリーンなフロントエンド(Leud)とWordPressを統合する専門設計アプローチとの差異は歴然です。

評価軸 汎用多目的テーマ+ビルダー継ぎ接ぎ Leud(Bootstrap 5)専門設計フレームワーク アーキテクトの選定基準
DOM階層の深さと表示速度 ビルダー特有の入れ子構造(20階層超)。CSS/JSが過大でモバイルのLCPが悪化 セマンティックなHTML5、最大深度6〜8階層。Bootstrap 5のFlexbox/Gridによる最小限のレンダリング負荷 災害時や外出先の低速モバイル回線でも1秒未満でファーストビューを表示可能
寄付フォームの転換摩擦 決済プラグイン標準の長大な入力フォーム。画面遷移が多く離脱率が高い アコーディオンおよびステップ式のUIコンポーネント。金額選択バッジと金額カスタム入力が連動 入力ステップ数を削減し、モバイル端末での寄付完了率を向上
資金使途の透明性・進捗表示 ページ全体を動的再生成するため、進捗バー更新のたびにフルページキャッシュが無効化 進捗バーUIは静的骨格として出力し、数値データのみをREST APIまたは軽量スクリプトで非同期更新 キャッシュヒット率を95%以上に維持したまま、進捗状況の正確性を担保
ボランティア・助成金受付 標準のwp_mail()に依存し、SPF/DKIM未設定による迷惑メール判定・ロストが多発 FluentSMTP+外部リレー(SES/SendGrid)による確実な配信と管理画面内でのロギング 法人パートナーや助成金申請などの重要コンタクトの欠落を完全に防止
アクセシビリティ(a11y) コントラスト比不足、不完全なARIA属性により、視覚障害者や公的機関からの評価が低下 WAI-ARIA標準に準拠したBootstrap 5コンポーネント。スクリーンリーダーに完全対応 公共性の高いNPOサイトとして必須となるWCAG 2.1 AA水準を満たす基盤
長期的な保守性とセキュリティ 30個以上のプラグインによる依存関係の崩壊と脆弱性リスクの増大 コア機能(CPT、Taxonomy、Webhook)をカスタムコード/mu-pluginsで完結。プラグインを最小化 10年スパンでの組織運用において、年次コアアップデートによる画面崩れを抑制

3. 開発サンドボックス構築と5ステップ導入手順

本番環境のダウンタイムや決済APIの誤動作を防ぐため、開発・検証は完全なStaging/Sandbox環境で実施します。

推奨インフラ構成基線

  • Web Server: Nginx 1.24+(FastCGI Microcache、HTTP/2、Brotli圧縮有効)

  • PHP Engine: PHP 8.2 / 8.3(OPcache JIT有効、memory_limit = 512M)

  • Database: MySQL 8.0+ / MariaDB 10.11 LTS(InnoDBバッファプールを実メモリの60〜70%に割当)

  • Object Cache: Redis 7.x(WordPressクエリオブジェクトキャッシュ用)

5ステップ標準導入手順

  1. 環境の完全分離とDNS設計:
    本番用ドメイン(npo-organization.org)と検証用環境(staging.npo-organization.org)をDNSレベルで分離します。検証環境にはBasic認証とX-Robots-Tag: noindex, nofollowを強制適用します。

  2. Bootstrap 5静的アセットのWordPressテーマ化:
    HTMLテンプレートの静的CSS/JS群を精査し、未使用のコンポーネントをパージします。Bootstrap 5のグリッドシステムおよび必要なUI部品を子テーマのassets/ディレクトリに配置し、wp_enqueue_scriptsを用いて正しくエンキューします。

  3. フォント・外部リソースのローカル同源化:
    Google FontsやCDNへの外部依存を排除します。必要なフォント(Inter、Noto Sans JPなど)をWOFF2形式でサーバーローカルにダウンロードし、CSS内で@font-face宣言。DNSルックアップ時間をゼロ化します。

  4. セキュリティヘッダーのハードニング(Nginx):
    寄付サイトへのフィッシングやクリックジャッキングを防ぐため、サーバー設定に以下のヘッダーを注入します:

    codeNginx

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://js.stripe.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-src https://js.stripe.com;" always;
  5. 決済サンドボックスとWebhookエンドポイント検証:
    Stripe等のテストAPIキーを発行し、モック寄付トランザクションを実行。受領完了WebhookがWordPress側のエンドポイントに到達し、署名検証(HMAC-SHA256)を経てステータスが更新されるかを確認します。


4. コアビジネス情報アーキテクチャと階層設計

NPOのWebサイトは、「誰が」「何のために」「どのように資金を使い」「どのような成果を上げたか」を直感的に把握できる構造でなければなりません。

codeCode

├── 組織概要・ミッション (About & Governance)
│   ├── ビジョン・設立趣旨
│   ├── 理事・役員名簿 (コンプライアンス情報)
│   └── 定款・年次財務報告 (アニュアルレポート・監査報告書)
├── プロジェクト・活動一覧 (CPT: cpt_cause)
│   ├── カテゴリ (Taxonomy: cause_category)
│   │   ├── 緊急災害復興支援 (Disaster Relief)
│   │   ├── 子ども・教育格差是正 (Education Support)
│   │   └── 医療・公衆衛生支援 (Healthcare Access)
│   └── 活動地域 (Taxonomy: project_region)
├── 支援方法・アクション (Get Involved)
│   ├── 都度寄付 (One-time Donation)
│   ├── 毎月の継続寄付 (Monthly Supporter)
│   ├── 遺贈寄付・有価証券による支援 (Legacy Giving)
│   └── ボランティア・プロボノ募集 (CPT: cpt_volunteer)
├── 活動報告・ニュース (Impact Stories & News)
│   ├── 現地レポート (Field Updates)
│   └── 収支報告速報 (Financial Updates)
└── お問い合わせ・資料請求 (Contact & Ingestion)

この階層構造をWordPress内で実現するため、cpt_cause(支援プロジェクト)およびcpt_report(年次報告書)をカスタム投稿タイプとして登録し、標準のブログ投稿(post)とは物理的に分離します。


5. 寄付転換とリードルーティングの実践

高額寄付の打診や助成金の問い合わせ、現地ボランティアの応募など、Webサイト経由のコンタクトは組織の生命線です。これらが「メールが届かない」「文字化けする」といったインフラ不全で失われることは、致命的な損失を意味します。

メール配信パイプラインの完全二重化とDNSレコード設定

PHP標準のmail()関数の利用は禁止事項です。FluentSMTP等の軽量ツールを用いてAmazon SES、SendGrid、またはPostmarkとAPI接続します。

  • SPF (Sender Policy Framework): 自組織のドメインから送信を許可するメールサーバーのIPを明示。

  • DKIM (DomainKeys Identified Mail): 2048ビットの公開鍵をDNSに登録し、送信元メールの改ざんを検知可能に設定。

  • DMARC: v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc-reports@organization.org を設定し、ドメインのなりすましメールを遮断。

非同期リード処理アーキテクチャ

寄付意思表明およびボランティア応募フォームの送信処理は、サーバーのプロセスを長時間ブロックしないよう非同期で処理します。

codeCode

[寄付者 / 応募者がフォーム送信]
                 │
                 ▼
[WordPress コア・バリデーション層] ──(Nonce検証 + Honeypot + サニタイズ)
                 │
                 ├─► 1. ローカルDBに暗号化保存 (通信エラー時のバックアップ用)
                 ├─► 2. FluentSMTP経由 ──► 寄付者へ受領完了メール、事務局へ通知即時配信
                 └─► 3. Webhookディスパッチャー ──► 署名付きPayloadを外部CRMへ転送
                                                    (Salesforce / HubSpotへ自動登録)

6. モバイルUXと緊急時CTAの最適化

NPOへのアクセスは、災害発生時やテレビ・SNSでの報道直後にモバイル比率が85%を超えます。モバイルユーザーが直面する入力ストレスを極限まで低減させるUI設計が不可欠です。

  1. 画面下部固定アクションドロワー(Sticky Donation Bar):
    モバイル表示時(画面幅768px未満)、画面下部に追従する「今すぐ支援する」CTAバーを常駐させます。タップで即座に金額選択シートがスライドアップする設計とし、ページスクロールによるCTAのロストを防ぎます。

  2. 定額選択ボタン(Amount Badges)の採用:
    「¥3,000」「¥5,000」「¥10,000」「その他(自由入力)」のチップ型ラジオボタンを配置し、タップ1つで金額が決定するUIを提供します。「¥3,000で子ども1人分の1ヶ月の教科書代になります」といった、金額に紐づくインパクトラベルを併記します。

  3. HTML5入力モードの明示:
    カスタム金額入力欄にはinputmode="numeric"およびpattern="[0-9]*"を指定し、スマートフォンの数字キーボードを直接立ち上げさせます。電話番号にはinputmode="tel"、メールアドレスにはinputmode="email"を指定し、入力ミスと離脱を防ぎます。


7. 業界特化型SEOとSchema.org構造化データ

NPO法人の公式サイトにおけるSEOは、単なるキーワード順位付けではなく、「実在する社会的組織としてのオーソリティ(E-E-A-T)」を検索エンジンに正しく認識させることが目的です。

ページタイプとSchemaマッピング

ページ種別 推奨Schemaタイプ 必須・重要プロパティ
トップページ / 組織情報 NonprofitOrganization, NGO name, taxID, foundingDate, address, nonprofitStatus, knowsAbout
個別支援プロジェクト(Causes) Project, DonateAction name, description, recipient, target, seeks
年次財務報告 / レポート Report, DigitalDocument headline, datePublished, financialSupport, publisher
よくあるご質問(FAQ) FAQPage mainEntity (Question & Answer 配列)

本番実装用 JSON-LD 構造化データコード

トップページおよび共通ヘッダーに配置する、非営利組織に最適化されたSchema.orgコードです。

codeHtml

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "NonprofitOrganization",
      "@id": "https://npo-organization.org/#organization",
      "name": "認定NPO法人 グローバル支援イニシアティブ",
      "alternateName": "Global Relief Initiative",
      "url": "https://npo-organization.org",
      "logo": "https://npo-organization.org/assets/img/logo.webp",
      "taxID": "1234567890123",
      "nonprofitStatus": "https://schema.org/Nonprofit501c3",
      "foundingDate": "2015-04-01",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "千代田区神田1-2-3",
        "addressLocality": "東京都",
        "postalCode": "101-0001",
        "addressCountry": "JP"
      },
      "knowsAbout": [
        "緊急災害支援",
        "教育格差是正",
        "国際人道支援"
      ],
      "potentialAction": {
        "@type": "DonateAction",
        "target": [
          {
            "@type": "EntryPoint",
            "urlTemplate": "https://npo-organization.org/donate/",
            "actionPlatform": [
              "http://schema.org/DesktopWebPlatform",
              "http://schema.org/MobileWebPlatform"
            ]
          }
        ],
        "recipient": {
          "@id": "https://npo-organization.org/#organization"
        }
      }
    }
  ]
}
</script>

8. 本番推奨プラグインエコシステム

プラグインの乱立はメモリ消費量を跳ね上げ、データベースの肥大化とセキュリティホールの原因となります。本番運用に耐えうるプラグインは以下の最小限に絞り込みます。

プラグイン名 担当機能・運用領域 選定理由とアーキテクチャ上の利点
Rank Math SEO メタタグ管理・Schema.org生成 モジュール単位で無効化が可能。JSON-LDスキーマをプログラムから柔軟に拡張・上書きできる
FluentSMTP トランザクションメール送信 フロントエンドのCSS/JS読み込みが完全にゼロ。ローカルでの送信ログ保存と再試行機能を内蔵
Redis Object Cache データベースクエリキャッシュ wp_optionsテーブルの読み出しやカスタム投稿のクエリ結果をインメモリキャッシュし、DB負荷を劇的に低減
Perfmatters アセットの最適化・不要コード無効化 ページごとに未使用なCSS/JSをアンロード(Dequeue)し、メインスレッドの占有時間を削減
WPCode Pro (または自作mu-plugin) カスタムロジックの安全な管理 テーマ更新による独自フックの消失を防ぎ、PHPエラー発生時の自動停止(Safe Mode)を担保

9. 開発者向け実用コードスニペット:Causes進捗カードコンポーネント

以下のコードは、Bootstrap 5のグリッドおよびプログレスバーと完全に調和するカスタムプロジェクト表示ショートコード [leud_cause_card] の実装例です。属性値の厳密なサニタイズ、エスケープ処理、およびCLS(レイアウトシフト)をゼロにするインラインスタイルを含んでいます。

子テーマの functions.php または /wp-content/mu-plugins/leud-components.php に配置して使用します。

codePHP

<?php
/**
 * Plugin Name: Leud Cause Card Component
 * Description: Production-ready shortcode rendering Bootstrap 5 charity project cards with clean escaping.
 * Version: 1.0.0
 * Author: Senior WordPress Commercial Architect
 */

if (!defined('ABSPATH')) {
    exit; // 直接アクセス禁止
}

function leud_render_cause_card_shortcode($atts) {
    // 1. パラメータの正規化とホワイトリスト検証
    $sanitized_atts = shortcode_atts(
        array(
            'title'        => '緊急子ども教育支援プロジェクト',
            'category'     => '教育支援',
            'goal_amount'  => '5000000',
            'raised_amount'=> '3750000',
            'donor_count'  => '142',
            'donate_url'   => '/donate/?project=education',
            'image_url'    => '',
        ),
        $atts,
        'leud_cause_card'
    );

    // 2. データの厳格なサニタイズと計算処理
    $title         = sanitize_text_field($sanitized_atts['title']);
    $category      = sanitize_text_field($sanitized_atts['category']);
    $goal_amount   = (float) preg_replace('/[^0-9.]/', '', $sanitized_atts['goal_amount']);
    $raised_amount = (float) preg_replace('/[^0-9.]/', '', $sanitized_atts['raised_amount']);
    $donor_count   = (int) absint($sanitized_atts['donor_count']);
    $donate_url    = esc_url($sanitized_atts['donate_url']);
    $image_url     = esc_url($sanitized_atts['image_url']);

    // パーセンテージ計算(ゼロ除算防止・上限100%制御)
    $percentage = 0;
    if ($goal_amount > 0) {
        $percentage = min(100, round(($raised_amount / $goal_amount) * 100));
    }

    // 3. セマンティックなHTMLバッファ生成
    ob_start();
    ?>
    <article class="leud-cause-card card h-100 shadow-sm border-0">
        <?php if (!empty($image_url)) : ?>
            <div class="leud-card-img-wrapper position-relative">
                <img src="<?php echo $image_url; ?>" class="card-img-top" alt="<?php echo esc_attr($title); ?>" loading="lazy" width="400" height="225">
                <span class="badge bg-primary position-absolute top-0 end-0 m-3"><?php echo esc_html($category); ?></span>
            </div>
        <?php endif; ?>
        <div class="card-body d-flex flex-column">
            <h3 class="card-title h5 mb-3 text-dark"><?php echo esc_html($title); ?></h3>
            
            <div class="leud-progress-section my-3">
                <div class="d-flex justify-content-between small text-muted mb-1">
                    <span>達成率: <strong class="text-dark"><?php echo esc_html($percentage); ?>%</strong></span>
                    <span>支援者数: <strong class="text-dark"><?php echo esc_html(number_format($donor_count)); ?>人</strong></span>
                </div>
                <div class="progress" style="height: 10px;" role="progressbar" aria-valuenow="<?php echo esc_attr($percentage); ?>" aria-valuemin="0" aria-valuemax="100">
                    <div class="progress-bar bg-success" style="width: <?php echo esc_attr($percentage); ?>%;"></div>
                </div>
                <div class="d-flex justify-content-between small mt-2">
                    <span class="text-muted">現在: <strong class="text-primary font-monospace">¥<?php echo esc_html(number_format($raised_amount)); ?></strong></span>
                    <span class="text-muted">目標: ¥<?php echo esc_html(number_format($goal_amount)); ?></span>
                </div>
            </div>

            <div class="mt-auto pt-3 border-top">
                <a href="<?php echo $donate_url; ?>" class="btn btn-primary w-100 fw-bold" role="button">
                    <?php echo esc_html__('このプロジェクトを支援する', 'leud-portal'); ?>
                </a>
            </div>
        </div>
    </article>
    <?php
    return ob_get_clean();
}
add_shortcode('leud_cause_card', 'leud_render_cause_card_shortcode');

/**
 * CLS対策用の最小限のクリティカルCSS注入
 */
function leud_enqueue_critical_card_styles() {
    if (!is_singular()) {
        return;
    }
    ?>
    <style id="leud-cause-card-inline-css">
        .leud-cause-card {
            border-radius: 12px;
            overflow: hidden;
            transition: transform 0.2s ease, box-shadow 0.2s ease;
        }
        .leud-cause-card:hover {
            transform: translateY(-4px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.08) !important;
        }
        .leud-card-img-wrapper {
            aspect-ratio: 16 / 9;
            background-color: #f1f5f9;
            overflow: hidden;
        }
        .leud-card-img-wrapper img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
    </style>
    <?php
}
add_action('wp_head', 'leud_enqueue_critical_card_styles', 95);

10. 5段階のリリース検証ワークフロー

公的信用が求められるNPOサイトのローンチでは、属人的な確認を排除したチェックリスト駆動のゲートウェイ管理が必要です。

codeCode

[フェーズ1: 基盤環境・SSL隔離] ──► [フェーズ2: IA構造・Schema検証] ──► [フェーズ3: 決済・メール導通試験]
  - Nginx, PHP-FPM, Redis調整       - CPT・階層設計の固定              - Stripe Webhook署名検証
  - セキュリティヘッダー適用        - Schema.orgバリデーション通過      - FluentSMTP SPF/DKIM疎通
                                                                                  │
                                                                                  ▼
[フェーズ5: 本番DNS切替・監視] ◄── [フェーズ4: 負荷試験・CWV監査] ◄────────────────+
  - TTL短縮後の切替実施             - Lighthouse モバイルLCP < 1.5s
  - 差分バックアップ・監視有効化     - CLS = 0 の完全確認

フェーズ別完了基準(Exit Criteria)

  1. フェーズ1:基盤環境・SSL隔離

    Nginx設定において全通信のTLS 1.3強制およびHSTSが設定済み。

    Redisオブジェクトキャッシュがwp-cli cache typeにて正常稼働を確認。

  2. フェーズ2:IA構造・Schema検証

    カスタム投稿タイプ cpt_cause および cpt_report の権限が正しく設定済み。

    Google「リッチリザルトテスト」にてNonprofitOrganization構造化データがエラー・警告ゼロ。

    外部フォント参照が全廃され、ローカルサーバーのWOFF2ファイルから配信されていること。

  3. フェーズ3:決済・メール導通試験

    テスト環境にて寄付トランザクションを10回実行し、決済代行会社側とWordPress側のステータスが100%一致。

    受領メールがGmail・Outlook等の主要クライアントで迷惑メールフォルダに入らず受信されること。

  4. フェーズ4:負荷試験・CWV監査

    擬似同時アクセス(毎秒50リクエスト)発生時にもサーバーCPU使用率が40%以下を維持(FastCGIキャッシュ有効化)。

    PageSpeed Insights(モバイル)において、CLS(レイアウトのズレ)が「0」であることを実測。

  5. フェーズ5:本番DNS切替・監視

    DNSのTTLを事前に300秒に短縮し、切り戻しが可能な状態でカットオーバーを実施。

    データベースの毎日自動暗号化バックアップ(外部S3バケット保存)の稼働を確認。


11. 現場エンジニアのための技術FAQ

Q1: クレジットカード情報のPCI-DSS準拠とWordPressの関係はどのように整理すべきですか?

回答: WordPressのデータベースには、クレジットカード番号(PAN)やセキュリティコード(CVV)を絶対に格納・通過させてはなりません。フロントエンドの実装ではStripe Elements等のiframeベースのUIライブラリを採用し、カード情報はユーザーのブラウザから直接決済プロバイダのPCI-DSS Level 1準拠サーバーへ送信させます。WordPress側は、決済完了後にプロバイダから返却される「トークン(顧客IDや支払いID)」のみを受け取り、注文データと紐付けます。これにより、WordPressサイト自体は最も負担の軽いPCI-DSS SAQ Aの監査対象範囲に収めることができます。

Q2: 寄付の進捗状況(集まった金額)をリアルタイムに更新すると、フルページキャッシュが無効化されませんか?

回答: 寄付の達成金額をページ生成時にサーバーサイドでレンダリング(SSR)すると、キャッシュパージが頻発してサーバーが過負荷に陥ります。プロの現場では、**静的骨格と動的データの分離(Hydrationモデル)**を採用します。HTMLページ自体は目標金額とスケルトンUIを含めた状態でNginxに長期キャッシュ(Cache-Control: max-age=3600)させます。最新の集計金額と達成率のみ、クライアント側の軽量JavaScriptがREST APIエンドポイント(/wp-json/npo/v1/cause-progress?id=123)からJSON形式で取得し、DOMの数値を書き換えます。これによりキャッシュヒット率を損なうことなくリアルタイム性を担保します。

Q3: Bootstrap 5のコンポーネントとWordPressのブロックエディタ(Gutenberg)が干渉しませんか?

回答: Bootstrap 5のユーティリティクラス(d-flex, row, col-*など)と、WordPressコアが出力するデフォルトクラス(wp-block-*)が競合しないよう、エディタ用のCSSリセットを行う必要があります。最善策は、テーマのadd_theme_support('editor-styles')を用い、エディタ内にもBootstrapのグリッドCSSを読み込ませた上で、活動報告の自由記述エリア(コンテンツブロック)にはBootstrapのスタイルを直接適用せず、独自のラッパークラス(例: .entry-content)配下にスコープを閉じることです。これにより、現場の運用担当者がビジュアルエディタで記事を執筆しても、サイト全体のBootstrapグリッドレイアウトが崩れるのを防ぎます。