=== situne Connector ===
Contributors: dropstone
Requires at least: 6.5
Requires PHP: 8.0
Stable tag: 3.3.1
License: Proprietary

WordPressをsituneへ接続し、匿名イベントと公開コンテンツ情報を同期します。

== Installation ==

1. ZIPファイルをWordPress管理画面からアップロードします。
2. プラグインを有効化します。
3. 管理画面の「situne」→「設定」でサイト専用トークンを入力します（トークンは situne アプリの「サイト」で発行します）。
4. 接続確認後、匿名計測を有効化します。

== 管理画面 ==

* 概要: 接続・計測・同期・AI 連携・ログイン保護・更新の状態、セットアップの進み具合、situne アプリ（ダッシュボード・分析・CTA・コンテンツ・変更履歴・サイト）への動線、最近の出来事。
* 設定: 接続トークン・匿名計測・AI 連携（WP Bridge）・署名鍵。
* ログイン保護: 保護の設定（2 段階認証・パスキーを必須にするロール、メールのログインリンク、ログイン URL）、ロックの一括解除、最近のロックと管理者の追加、セキュリティの出来事。
* バックアップ: スナップショットの作成・復元（消えるもののプレビュー付き）、更新前の自動スナップショットと自動ロールバック、定期バックアップ、外部ストレージ、緊急復旧ページ。
* 操作ログ: 誰が・どこから（管理画面・situne・cron など）・何をしたかの記録、保持期間、situne への報告。
* 更新情報: 現在／最新のバージョン、変更履歴、更新の実行。更新は situne.jp の更新情報を 12 時間ごとに確認し、WordPress 標準の更新（プラグイン一覧・更新画面・自動更新）に載せます。
* WordPress ダッシュボードのウィジェットとプラグイン一覧の「設定」リンクからも開けます。

== CTA・フォーム・既存導線の改善 ==

1. Connectorが公開ページ上のボタン・テキストリンク・フォームの位置とデザインを匿名取得します。
2. situneアプリの「CTA・フォーム・既存導線」で実データ提案と実装プレビューを確認します。
3. 新しいパーツの追加、または既存要素の文言・リンク先・色の変更を「実サイトへ公開」で反映します。

フォーム入力値、氏名、メールアドレスはsituneへ送信されません。位置・公開デザインと匿名イベントだけを計測します。

== ログイン保護 ==

Connector を有効化するだけで、situne への接続とは関係なく WordPress のログイン経路を守ります。既存の運用を壊さないものだけを既定でオンにし、管理画面の situne 設定でいつでも個別にオフにできます。

* ログイン試行の制限（既定オン）: 同じ接続元から 15 分間に 5 回失敗すると 15 分間ログインを止めます。繰り返すと最長 24 時間まで延長します。ログイン画面・XML-RPC・REST（アプリケーションパスワード）の失敗をまとめて数え、正しいログインで失敗回数は消えます。Wordfence・SiteGuard・Limit Login Attempts などのログイン保護プラグインが有効な場合は、二重のロックを避けるため自動で無効になります。
* ユーザー名の漏えい防止（既定オン）: 「?author=1」での転送、未ログインでのユーザー一覧 API（/wp/v2/users）、ユーザーのサイトマップを止め、ログイン失敗時に「ユーザー名が違う」「パスワードが違う」を区別しません。
* XML-RPC の停止（既定オフ）: xmlrpc.php と pingback を止めます。WordPress アプリや外部の投稿ツールを使っている場合はオンにしないでください。
* アプリケーションパスワードの停止（既定オフ）: REST API の Basic 認証を無効にします。
* 管理者の追加を記録し、ロックの発生とあわせて次回の接続確認で situne に報告します。接続元 IP は末尾を伏せた形でのみ保存・報告し、入力されたユーザー名やパスワードは送信しません。

== WP Bridge（situneからの投稿・コード編集） ==

* 投稿・固定ページ: 「AIからの投稿編集を許可」（既定オン）。新規は下書き、公開中の記事は書き換えずに「変更予定」として保存し、situneで公開を実行したときだけ反映します。同じ許可で、ChatGPT / Claude の画像（PNG / JPEG / GIF / WebP、5MB まで）をメディアライブラリにアップロードし、アイキャッチや本文の画像に使えます。
* テーマ・プラグインのファイル: 「situneで承認したコード変更の反映を許可」（既定オフ）。AIは読み取りと提案のみ。situneの管理画面でオーナー／管理者が承認した変更だけが届きます。
* 反映前にバックアップ（30日保持）、PHP構文チェック、反映後の表示確認（25秒以内）を行い、問題があれば自動で元に戻します。バックアップはドキュメントルートの外（WordPress の 1 つ上の situne-backups）に置ける場合はそこに、無理なら wp-content/situne-backups/ に、Web から読めない .php 形式（1行目が exit）で保存します。
* 安全装置として wp-content/mu-plugins/situne-safe-mode.php を設置します。変更直後（15分以内）に致命的エラーが起きた場合、自動で変更前に戻します。
* situneからのリクエストは Ed25519 署名で検証します。署名鍵と situne のサイトIDを接続時に固定し（管理画面の「署名鍵を再取得」以外では変わりません）、送信先のホスト・パスも署名に含めるため、他のサイト宛てのリクエストは受け付けません。

== Changelog ==

= 3.3.1 =
* テーマの JavaScript が差し替えて使う画像・動画（例 <video data-mobile-src> のスマートフォン用の動画）も書き出すようにしました。data-○○-src / data-○○-srcset を拾います。
* 静的化の画面の「静的サイトでは動かない要素があるページ」を畳んで表示するようにしました。見出しに、要素の種類ごとのページ数を出します。

= 3.3.0 =
* 静的化の画面の先頭に、公開までの手順（Cloudflare への接続・確認用ドメインでの表示確認・WordPress のサブドメインへの移動・公開ドメインへの書き出し・ドメインの割り当て・検索エンジンから隠す・毎日の書き出し）を表示し、済んだかどうかを自動で判定するようにしました。公開ドメインが最新の書き出しを返しているかは「いま確かめる」で確かめられます。
* WordPress 本体で「検索エンジンがサイトをインデックスしないようにする」をオンにしても、書き出す静的サイトには noindex・全拒否の robots.txt が載らないようにしました。静的化の画面の「オンにする」で設定できます（WordPress が公開ドメインと同じホストのあいだは断ります）。
* 「版の情報」（既定オン）を追加しました。書き出すファイルから WordPress・プラグインの版の情報（generator・版番号付きのコメント・?ver=）を消します。
* 「WordPress 本体の表示」（既定オフ）を追加しました。ログインしていない人が WordPress 本体のページを開くと、静的サイトの同じページへ転送します。管理画面・ログイン・REST・ログイン中の人・書き出しは転送しません。
* テーマが公開ドメインのアドレスで直接書いている画像や、構造化データ（JSON-LD）だけにある画像も書き出すようにしました。
* WordPress から取得できないページがあるときは、デプロイせずに止めるようにしました（公開中の静的サイトは前回のまま）。止まった理由とページの例を表示します。Cloudflare の一時的なエラーは自動で 3 回までやり直します。
* 「更新前のバックアップが時間内に完了しなかった」のお知らせを × で消せるようにし、バックアップが完了すると自動で消えるようにしました。
* 管理画面の表記を「situne」（小文字）にそろえました。

= 3.2.2 =
* 管理画面の色を situne のアイコン（黒地に赤と淡いピンクの点）に合わせました。ヘッダーを黒地にし、ボタン・タブ・進捗バーなどをアイコンの赤にしています。ヘッダーの右下に JPW のロボットが顔を出します。

= 3.2.1 =
* 静的化（第 1 段階）を追加しました。「situne → 静的化」で、サイトを静的な HTML に書き出し、Cloudflare（Workers Static Assets・Pages）か ZIP で配信できます。書き出し後のチェック（リンク切れ・アセット・canonical・サイトマップなど）、静的にすると動かない要素の一覧、夜間の全再生成、確認用ドメインの noindex に対応します。
* 大きなプラグイン（Site Kit by Google など）の自動更新が、更新前バックアップの時間切れで見送られ続ける問題を直しました。見送ったときに作ったスナップショットが完成していれば、次の更新ではファイル部分を使い回し、データベースだけ取り直します。
* プラグイン一覧の「今すぐ更新」・一括更新を手動更新として扱うようにしました。更新前バックアップが時間内に終わらなくても、警告を出して更新を続けます（バックアップはバックグラウンドで完成します）。

= 3.1.4 =
* 版番号を 3.1.4 にしました。機能は 3.0.2 と同じです（situne からの書き込み前のサイト全体バックアップ、定期バックアップの既定オン、バックアップの状態の報告）。

= 3.0.2 =
* situne（AI・situne 管理画面）から投稿を保存・公開する前に、直近のサイト全体（データベース）のスナップショットが無ければ自動で取るようにしました。24 時間以内（1 / 6 / 24 時間から選択）に取ったスナップショットがあれば使い回します。「situne → バックアップ」でオフにもできます。
* 定期バックアップの既定を「毎日」にしました。新しくインストールしたサイトと、2.x 以前から更新したサイトで有効になります（3.0.0〜3.0.1 で保存済みの設定は変わりません）。更新しただけのサイトでも予約が登録されるようにしました。
* バックアップの状態（定期実行・最新のスナップショットの日時・外部保管・書き込み前バックアップ）を situne に報告し、ダッシュボードの「サイト」に表示するようにしました。ファイルの中身や保存場所は送りません。
* 「situne → バックアップ」の一覧に、取得の理由（定期・situne からの書き込み前）を表示するようにしました。

= 3.0.1 =
* プロフィール画面で 2 段階認証の設定・解除・バックアップコードの再発行をしたあと、画面の先頭ではなく 2 段階認証の欄に戻るようにしました。確認コードが違うときは欄の中にもエラーを表示します。

= 3.0.0 =
* 2 段階認証（認証アプリの確認コードとバックアップコード）とパスキーを追加しました。ロールごとに必須にでき、XML-RPC とアプリケーションパスワードの抜け道も塞ぎます。全ユーザーのセッションを一括で無効にできます。
* ログインの手段を追加しました。メールのワンタイムログインリンク（既定オン）、situne からのワンタイムログイン（既定オフ）、ログイン URL の変更（任意）。締め出されたときは wp-config.php の SITUNE_DISABLE_LOGIN_PROTECTION でパスワードだけのログインに戻せます。
* プラグイン・テーマ・本体の更新前に、対象のファイルとデータベースのスナップショットを取るようにしました。更新後にサイトの表示を確認し、異常があれば自動で元に戻して、その版の自動更新を保留します。
* 「situne → バックアップ」を追加しました。手動のスナップショット、消えるものを確認してからの復元、定期バックアップ（毎日のデータベースと週 1 回のファイル）、S3 互換ストレージへの暗号化保存、WordPress が開けないときの緊急復旧ページ。
* 「situne → 操作ログ」を追加しました。ログイン・プラグインやユーザーの変更・設定変更・situne からの操作などを重要度つきで記録し、「注意」以上を situne のダッシュボードに報告します（90 日保持。パスワードや本文は記録しません）。
* 更新情報と配布 ZIP を署名で確認してから更新するようにしました。situne 側の緊急停止と署名鍵のローテーションに対応しました。
* 画面の文言を翻訳できるようにしました（テキストドメイン situne。原文は日本語）。

= 2.5.2 =
* 管理画面を「概要」「設定」「ログイン保護」「更新情報」の 4 ページに再構成しました。概要にはセットアップの進み具合、各機能の状態、situne アプリへの動線、最近の出来事を表示します。
* situne.jp の更新情報を確認し、WordPress 標準の更新（プラグイン一覧・更新画面・自動更新・詳細表示）に Connector の新バージョンを載せるようにしました。
* WordPress ダッシュボードに situne ウィジェットを追加し、プラグイン一覧に「設定」「概要」「situne アプリ」リンクを追加しました。未接続のときはダッシュボードとプラグイン一覧で接続を案内します。
* ログイン保護を追加しました。有効化するだけで、ログイン試行の制限（同じ接続元から 15 分に 5 回失敗で 15 分ロック、繰り返しで最長 24 時間）と、ユーザー名の漏えい防止（?author=N の転送、未ログインでの /wp/v2/users とユーザーのサイトマップ、ログイン失敗メッセージの区別）が既定でオンになります。
* XML-RPC の停止とアプリケーションパスワードの停止をオプトインで追加しました（既定オフ）。
* 他のログイン保護プラグイン（Wordfence・SiteGuard・Limit Login Attempts 等）が有効な場合は、試行制限を自動で無効にして管理画面に表示します。
* ロックの発生（接続元は末尾を伏せた形）と管理者の追加を記録し、管理画面に表示するとともに、次回の接続確認で situne に報告します。

= 2.5.0 =
* situne（ChatGPT / Claude）から画像をメディアライブラリへ直接アップロードできるようにしました（media.upload。PNG / JPEG / GIF / WebP、5MB まで。中身の形式を確認してから uploads に保存します）。
* 投稿の保存でアップロード済みの添付ファイル ID をアイキャッチに指定できるようにしました（featured_media_id）。

= 2.4.0 =
* WP Bridge を追加しました。situneから署名付きリクエストで投稿・固定ページの下書き作成・編集・公開・復元ができます。
* 公開中の記事への編集は「変更予定」（自動保存リビジョン）として保存し、公開を実行するまで本番の表示を変えません。
* situneで承認したテーマ・プラグインのファイル変更を反映できるようにしました（既定オフ）。バックアップ・構文チェック・ヘルスチェック・自動ロールバック付きです。
* 致命的エラー時に直前の変更を自動で戻す安全装置（mu-plugin）を追加しました。自動で戻した記録は次回の接続確認でsituneへ報告します。
* 管理画面に、署名鍵の指紋・最終ブリッジ操作・最近の自動ロールバックの表示と「署名鍵を再取得」ボタンを追加しました。

= 2.3.4 =
* 自動公開パーツのリンク先を同一サイト内（相対パス、または同一ホストのURL）に限定しました。外部URL・mailto・telは既定のリンク先に置き換えます。
* パーツの色設定を安全な形式（16進・rgb()/hsl()・一部の色名）に限定しました。

= 2.3.3 =
* situneの比較画面から、実ページ内の対象要素へ変更案を一時反映できるプレビューブリッジを追加しました。
* デスクトップ・モバイルとも、実サイトのレスポンシブレイアウト内で変更前後を確認できます。
* プレビュー変更は保存されず、比較タブの切替または再読み込みで元に戻ります。

= 2.3.2 =
* 既存のボタン・テキストリンクを選び、文言・リンク先・配色を変更できるようにしました。
* situneから公開した変更だけを対象セレクタへ安全に反映します。
* フォーム項目にサイトURLを追加しました。
* situneで設定したサイト配色を自動公開・ショートコード表示へ反映します。
