# LW Simple Forms - Changelog

## v1.1.1 (2026-03-27)

### 新機能

#### 初回インストール時にサンプルフォームを自動作成
- プラグイン初回有効化時に、すべてのサポート対象フィールドタイプ (text, tel, email, radio, checkbox, textarea, select, select multiple) を含むサンプルフォームを下書きとして作成
- 再有効化時には作成されない (wp_options の `lwsf_sample_form_created` で制御)

### ドキュメント改善

- キャッシュプラグイン/CDN との互換性に関する注意書きを追加
- CSS スタイルに関する注意書きを追加 (フロントエンド CSS は含まれていない)
- Installation セクションのショートコードに (optional) を明記
- PHP バージョン互換性の明確化 (PHP 8.3 でテスト済み)
- WordPress 6.9 との互換性を更新

## v1.1.0 (2026-03-19〜20)

マイグレーションプロジェクト（BigScoots → Liquid Web）を通じて行った改修。

### 新機能

#### reCAPTCHA v3 対応
- **管理画面**: LW Simple Forms > Settings に reCAPTCHA v3 の Site Key / Secret Key 設定画面を追加
- **フロントエンド**: reCAPTCHA が設定されている場合、フォームページに `recaptcha/api.js` を自動読み込み。フォーム送信前に `grecaptcha.execute()` でトークンを取得し hidden field として送信
- **サーバーサイド検証**:
  - REST API バリデーション時にトークンを検証し、結果を DB に `__recaptcha_verified=true` として保存
  - JS 無効時のフォールバック: `process_input_submission` で直接トークンを検証
  - `shortcode_lwsf_complete` の新規送信時: DB に検証結果がなければ POST トークンを検証
  - Google API との通信エラー時はフェイルオープン（ユーザーをブロックしない）
  - スコア閾値: 0.5 以上で通過

#### PRG（Post-Redirect-Get）パターンによる重複送信防止
- 完了画面表示時に cookie にセッションキーを保存し、クリーン URL（パラメータなし）へ 302 リダイレクト
- GET リクエストで cookie からキーを取得して完了画面を表示後、cookie を削除（1回限り表示）
- リロード時は cookie がないため入力ページへリダイレクト
- cookie の有効期限: 5分

### 改善

#### WordPress 予約語チェックの強化
- フォームのフィールド名に WordPress 予約クエリ変数（`name`, `p`, `s`, `page` 等）が使われている場合、**保存をブロック**してエラーを表示（以前は警告のみ）
- エラーメッセージ例:「保存をブロックしました: 以下のフィールド名はWordPressの予約語で、404エラーの原因になります: name」
- 大文字小文字を区別する比較に変更（`Name` は許可、`name` はブロック）

#### wp_kses 許可タグの拡張
- `<form>` タグ（action, method, class, id 等の属性）を許可リストに追加
- `<button>` タグ（type, name, value, class 等）を許可リストに追加
- `<textarea>` タグ（name, rows, cols, placeholder 等）を許可リストに追加
- これにより確認画面の Back/Send ボタンの HTML 属性（class 等）が正しく保持される

#### フロントエンド CSS の外部化
- プラグインからインライン CSS を出力しない方針に変更
- エラーメッセージやボタンのスタイルは各サイトの `style.css` で管理

#### ボタンラベルの変更
- 入力画面のデフォルトボタンテキスト: `Confirm Input` → `Confirm`
- 日本語翻訳: `確認する` / `送信する` / `戻る`

#### POST データの wp_unslash 対応
- `$_POST` データの全参照箇所に `wp_unslash()` を追加
- WordPress の `wp_magic_quotes()` によるバックスラッシュ多重エスケープ問題を解消
- `I'm` → `I\'m` → `I\\\'m` のような文字化けがなくなった

#### HTML サニタイズ警告の改善
- `wp_kses` による `style` 属性の末尾セミコロン削除を「変更あり」と誤検知しないよう正規化比較を追加
- 「potentially unsafe HTML」の汎用メッセージを、実際に変更された行の内容を表示するように改善

#### 管理画面の注記修正
- 「scriptタグとstyle属性はセキュリティ上の理由により許可されていません」→「scriptタグはセキュリティ上の理由により許可されていません」に変更（style 属性は許可）

### バグ修正

#### confirm なしモード（直接送信）の修正
- REST API バリデーション成功後、クエリパラメータ `?lwsf_complete=1&key=...` を URL に付加する方式を廃止
  - WordPress がクエリパラメータを解釈して 404 を返す問題があった
- 代わりに REST API 内でメール送信まで完了し、`show_complete=true` フラグを JS に返す方式に変更
- JS 側で `lwsf_show_complete` hidden field を追加してから form.submit()

#### reCAPTCHA トークンの再生成
- REST API バリデーション後の `form.submit()` 前に `executeWithRecaptcha()` でトークンを再生成
- reCAPTCHA トークンは1回しか使えないため、REST API で消費後に新しいトークンが必要

#### async-javascript プラグインとの互換性
- `async-javascript` プラグインが `lwsf.js` に `async` 属性を付加すると、`lwsf_form_params` の読み込み順が崩れてフォームが動作しない問題を確認
- 対処: プラグインの除外設定に `lwsf-form-handler` を追加するか、プラグインを無効化

### 技術的な注意事項

- **フォームフィールド名**: WordPress 予約語（小文字の `name`, `p`, `s`, `page` 等）は使用不可。大文字始まり（`Name`）または接頭辞付き（`your_name`）を使用
- **CSS**: プラグインはフロントエンド CSS を出力しない。各サイトの style.css に以下のクラスを定義:
  - `.lwsf-form p.error` — バリデーションエラーメッセージ
  - `.lwsf-error-message` — JS バリデーションエラー
  - `.lwsf-confirm-buttons` — 確認画面の Back/Send ボタンコンテナ
  - `.sbmt button` — 送信ボタン
  - `.lwsf-form button.send` — Send ボタン
  - `.lwsf-form-back button.back` — Back ボタン
  - `.lwsf-pre-wrap` — テキストの折り返し表示
- **翻訳**: `languages/lw-simple-forms-ja.po/.mo` を更新。`msgfmt` で .mo を再生成する必要あり
