修正された内容
- •アップデータのエラー:ファイルおよび
version.json の書き込み失敗、パッチ・変更プレビュー未対応、リポジトリへ接続できない場合・接続成功。
- •アップデート画面:サーバー応答エラー、「N ファイル変更 · N コミット」、完了・適用中・作業登録済み・タイムアウト・ロールバック完了。
- •作業登録の案内:アップデート・パッチ・ロールバックの作業が登録されたというメッセージ。
- •権限ワーカー(cron)が残す進行メッセージと、完了・失敗の通知も正しい言語で表示されます。
変更履歴画面(`/changelog`)
- •「5 months ago」のような相対時間が韓国語と英語の2種類しかなかったものを、13言語に対応しました。
空の一覧の案内、「AI翻訳」表示、「翻訳なし — KO で表示」の案内、「最新 N 件のみ表示」も合わせて翻訳されます。
- •画面の言語を、セッションの値だけでなくサイトが実際に使っている言語(
?lang=・セッション・Cookie・既定の言語)で決めるようにしました。
以前は初回訪問時に韓国語になってしまい、日本語・英語のサイトにも韓国語の表記が混ざっていました。
- •長い識別子やパス(空白のない文字列)がカードの外にはみ出し、右側のインストール案内ボタンの下に潜り込んでいた問題を修正しました。
知っておいていただきたいこと
- •権限ワーカーにはログインしている人がいないため、言語がありません。ワーカーはサイトの既定の言語でメッセージを残します。
(以前は翻訳システムを起動していなかったため、updater.write_failed のような翻訳キーがそのまま表示されることがありました。ワーカーが翻訳を起動するようにしました。)
- •サーバーログ(
error_log)と開発用のデバッグログは運用担当者が読むものなので、そのままにしてあります。
- •すでにインストールされているサイトでは、アップデートを実行するのは、すでに入っている古いアップデータです。そのため、この改善は2.8.2 にしたあとのアップデートから反映されます。
多言語
- •ホーム画面への追加・インストール案内のアプリ名と説明が、閲覧者の言語で表示されます。以前は設定値(例:日本語)がそのまま表示されていました。
翻訳は rzx_translations の pwa.front.name などのキーに置きます。manifest.php は正式な出力先に引き渡すだけに整理しました。
- •構造化データ(JSON-LD):設定値の翻訳を先に参照します。パンくずリストの2番目にサイト名まで入っていた問題と、「Home」がすべての言語で英語のまま表示されていた問題を修正しました。
- •統計ウィジェット:数値と単位(
suffix)もラベルと同様に言語ごとの値を受け付けます。単一の値はこれまでとまったく同じように動作します。
- •オフライン画面とサービスワーカーの最終案内文を、韓国語・日本語・英語の3言語にしました。
サービスワーカーのキャッシュバージョンが v5 から v6 に上がるため、すでにインストール済みの端末も新しい画面を受け取ります。
- •メッセージ検索の「検索結果なし」が韓国語で直接書かれていたものを、13言語に対応しました。
検索エンジン・AI
- •
<meta property="og:locale"> と代替言語(og:locale:alternate)を出力します。SNS で共有されたときに、どの言語のページかが伝わります。
- •コードで描画する公開システムページも
sitemap.xml に載ります(漏れていました)。
- •
llms.txt の最初の行(サイトの説明)が閲覧者の言語で表示されます。
- •ページごとの robots 設定(管理画面に入力欄はありましたが、どこからも読まれていませんでした)が実際に適用されます。
修正された問題
- •
?lang= の値を、対応言語の一覧と照合したうえでのみ受け付けます。以前は、対応していない値が Cookie に1年間残り、
あとでその言語を開くと、本人の意思とは無関係にその画面に切り替わることがありました。言語選択も同じルールに従います。
- •ウィジェットビルダー:画面に入力欄がない言語の翻訳が、保存のたびに消えてしまう問題。
- •コミュニティのメッセージ検索:名前が暗号化されて保存されているため、どの名前を入れても0件になる問題。復号してから照合します。
アップデートでサイト独自のコア改造を保護
- •
storage/custom/update-preserve.txt に1行に1つずつパスを書くと(# はコメント、フォルダも可)、アップデートがそのファイルを上書きしません。
サイト専用のログインルールなど、コアのファイルに直接入れたものを守るときに使います。絶対パスと .. は受け付けません。
ファイルを読み込めなくてもアップデートは止まらず、既定の保護リストで進みます。
- •知っておいていただきたいこと:アップデートを実行する側がこの機能を持っている必要があります。2.8.1 にしたあとのアップデートから適用されます。
何が変わったか
決済モジュールには代行会社ごとのファイルがすでにありましたが、「どの代行会社があるか」はコードの複数の場所に書き込まれていました。
新しい代行会社を入れるには、決済管理のコード・設定画面・Webhook をすべて書き換える必要がありました。
- •
rzxlib/Modules/Payment/Gateways/ にフォルダ(gateway.json と実装ファイル)を入れると、コアが自動で認識します。
管理画面の設定にある代行会社の選択・キー入力欄・Webhook のアドレスが、その仕様書から作られます。
- •サイトは設定画面で代行会社を1つ選びます(これまでと同じです)。複数の代行会社を同時に使う機能ではありません。
- •追加の方法は
docs/PAYMENT_GATEWAYS.md にまとめました。
Square
- •カード決済・返金・照会、保存カード(定期請求用)、Webhook(署名検証つき)に対応しています。
- •カード入力フォームは本人認証(SCA)を行い、失敗したときは画面に理由を表示します。13言語に対応しています。
- •管理画面の設定に「接続テスト」ボタンが加わりました。テストモードで少額決済 → 照会 → 返金を実行し、
キーの設定が正しいか確認します。実際のお金は動かず、本番(live)モードでは実行されません。
- •Square を選ぶまでは、どのサイトにも影響はありません。
既存の代行会社(PAY.JP・Stripe)はそのまま
- •2つの代行会社の実装ファイルには手を加えていません。以前の設定(単一キー・v2・v3)はこれまでどおり読み込まれます。
- •仕様ファイルを読み込めない状況になっても、PAY.JP と Stripe は従来の方法で生成されるよう、安全装置を設けました。
- •運用サイトの実際の設定と、さまざまな形の合成設定で、旧コードと新コードが同じ代行会社・同じモード・同じキーを
選ぶことを比較して確認しました(scripts/test-payment-parity.php)。
サイトごとの決済設定の読み込み
1つのデータベースにサイトごとの決済設定が別々にある場合、決済モジュールは自分のサイトの設定を読みます。
以前は、どのサイトの設定が選ばれるかが決まっていませんでした。自分のサイトの設定がなければ、従来どおり動作します。
知っておいていただきたいこと
- •共通の Webhook アドレスが追加されました(
/api/webhook-payment.php?gateway=…)。既存の PAY.JP・Stripe の Webhook アドレスは変わりません。
- •設定画面の代行会社の一覧は従来と同じ順序で、仕様書から入った代行会社はその後ろに加わります。
何が問題だったか
サイトマップ(sitemap.xml)とAI向け案内文(llms.txt)には、コアが把握しているものだけが載っていました。
プラグインが自分のページを載せるには、コアのファイルを直接書き換えるしかなく、その修正は
アップデートのたびに消えていました。さらに、コアがプラグインの一覧を推測して読んでいたため、気づかないうちにずれていた箇所がありました。
- •不動産物件は別のアドレス(
/properties-sitemap.xml)でのみ出力されており、どこからもそのアドレスを
指していなければ、検索エンジンが見つけられませんでした。
- •マーケットのアイテムは、存在しない列を探す照会文のせいで一度もサイトマップに載ったことがありませんでした。
エラーはそのまま握りつぶされ、誰も気づいていませんでした。
- •一部のサイトでは、お店のアドレスを誤った形で載せていたため、開いても存在しないページになるアドレスを検索エンジンに登録させていました。
プラグインが自分のページを直接出力する
- •プラグインの
plugin.json に seo を書くと、コアがそれを読み取ってサイトマップとAI向け案内文に合流させます。
ウィジェット・レイアウト・イントラネットモジュールと同じ方式で、同じアドレスはコアが優先されます。
- •複数言語用のアドレスと言語表示は、コアが自動で付けます。プラグインはアドレスを出すだけで済みます。
- •プラグインが1つ壊れても、サイトマップ全体は止まりません。そのプラグイン分だけが抜けます。
- •無効にしたプラグインのアドレスは自動的に除外されます。無効なプラグインのページはもともと開けないためです。
中国語の代替アドレスが無視されていた問題
サイトマップが言語表示を zh_CN と書いていましたが、標準は zh-CN であるため、Googleがその行をまるごと無視していました。
ページ自体は正しく書かれていたので、同じサイトが2か所で違うことを言っている状態でした。
簡体字・繁体字の中国語の代替アドレスが、正しく認識されるようになりました。
AI向け案内文を言語別に
- •
llms.txt は既定の言語1種類だけでした。?lang=en のように言語版を出力するようになりました。
物件名や説明がその言語で出力され、案内文の冒頭にどの言語版かが記されます。
- •多言語サイトで、AI回答エンジンが各言語圏の利用者にこのサイトを読み上げられるようになります。
社員が自分の人事カードを見られる(イントラネット)
- •人事担当者だけが見られた人事カードを、本人も閲覧できます。上部のプロフィールメニューから入ります。
- •閲覧のみ可能です。修正したい内容があれば申請し、人事担当者が承認する流れを準備中です。
- •評価は本人には表示されません。賞罰も同様です。添付書類は一覧のみが表示されます。
- •アドレスバーを書き換えて他人のカードを開くことはできません。誰のカードかはログイン情報だけで決まります。
- •誰が自分の人事情報を閲覧したかも、本人が確認できます。
掲示板の画面を別の枠の中で使えるように
掲示板画面のリンクはすべて1つの値($boardUrl)から作られますが、コアがその値を無条件に上書きしていました。
そのため、イントラネットのように管理画面の中で掲示板を使う側は、描画済みの画面を1文字単位で置き換える必要がありました。
コアがリンクの形を少し変えるだけで、気づかないうちにずれてしまう構造でした。
- •呼び出し側が基準アドレスをあらかじめ決めておけば、その値を使います。決めていなければ、これまでとまったく同じです。
- •歯車(掲示板設定)のリンクも1か所で決めます。以前は、一覧・FAQ・Q&A・リンクスキンの4か所がそれぞれ作っていました。
レイアウトをプラグインの中に置けるように
- •レイアウトをコアの
skins/layouts/ から先に探し、なければプラグインの plugins/{id}/skins/layouts/ から探します。
ウィジェット・イントラネットモジュールと同じルールで、同じ名前はコアが優先されます。
- •管理画面のレイアウト選択にも、プラグインのレイアウトが一緒に表示されます。
- •これまでは、プラグイン専用のレイアウトをコアのフォルダに置く必要がありました。アップデートで消えることはありませんが、
のちにコアが同じ名前のものを出すと上書きされ、プラグインを別のサイトへ移すときもフォルダを手作業で持っていく必要がありました。
プラグインがイントラネットモジュールを自分で宣言する
イントラネット画面(左メニュー・入口の経路)の一覧は、コアの設定ファイル1つにしかありませんでした。
プラグインが自分のモジュールを入れるにはコアのファイルを書き換える必要があり、アップデートするとその内容が消えていました。
- •プラグインの
plugin.json に intranet_module を書くと、コアが読み取って合流させます。メニュー・システムページと同じ方式です。
- •値には配列を直接書くことも、
"data/intranet-module.php" のようにファイルパスを書くこともできます。
- •同じ名前はコアが優先されます。プラグインがコアのモジュールを乗っ取って、基本の動作を変えることはできません。
- •コアでこの一覧を読んでいた5か所をすべて新しい方式に変えました。アップデートで設定ファイルが上書きされても、プラグインのモジュールはそのまま残ります。
日付入力に和暦
- •日本語の画面の日付入力欄で、元号の選択(令和・平成・昭和・大正・明治)と年数を入れると、西暦の年が自動で入ります。
生年月日のように元号で覚えている値を、毎回換算する必要がありません。
掲示板のレイアウト設定が画面に反映されなかった問題
- •管理画面で掲示板ごとにレイアウトを選んでも、画面にはサイトの既定のレイアウトが表示されていました。
保存する場所と読み取る場所が食い違っていました。
- •修正:掲示板を保存するときに、画面が読み取る設定にも同時に書き込みます。
既存の掲示板は、再保存するまで現在の見た目のままです(見た目が突然変わることはありません)。
v2.7.14
2026-09-20 · 29日前
掲示板の書き込み・検索を正常化
書き込んでも保存されなかった問題
- •投稿の保存がタイトル列を除いて処理されていたため、その列が残っているサイトでは保存に失敗していました。
画面には「Unexpected end of JSON input」としか表示されませんでした。
- •修正:列が残っていれば、その値も一緒に入れます。列を削除したサイトはこれまでどおり動作します。
掲示板の検索
- •検索が旧列を探していたため、列を削除したサイトでは、検索語を入れた瞬間に一覧全体が開かなくなりました。
- •列が残っているサイトにも問題がありました。投稿を修正しても列は更新されないため、修正前の内容でしか検索されませんでした。
- •修正:検索を翻訳テーブルで行います。これで表示している言語と、翻訳された内容まで検索できます。
一覧・ウィジェット・マイページで投稿が見えなかった問題
- •業務分野タブのウィジェットと掲示板グリッドのウィジェットが、常に空の一覧でした(エラーが内部で握りつぶされていました)。
- •マイページの「自分のコメント」で、掲示板のコメントがまるごと抜けていました。
- •リンク掲示板のスキンは、タイトルが常に空でした。
- •修正:すべて翻訳テーブルからタイトルと本文を読みます。サムネイルも本文から改めて探し出します。
AI翻訳・新規インストール
- •投稿のAI翻訳が原文の読み取りで失敗し、翻訳作業がすべて失敗に終わっていた問題を修正しました。
- •新規インストール時に入れるサンプル投稿の元の言語のタイトル・本文が翻訳テーブルに入らず、タイトルが空に見えていた問題を修正しました。
その他
- •掲示板の並び順を「おすすめ順」にしていた場合に一覧が開かなかった問題を修正しました(存在しない列を参照していました)。
v2.7.13
2026-09-20 · 29日前
管理画面のお知らせ窓の安全性・多言語
お知らせ窓に他人の文字がそのまま入っていた問題
管理画面の共通のお知らせ窓(結果モーダル)は、メニュー名・スキン名・サーバーからの文言をそのまま画面に貼り付けていた。
名前に <script> のような文字を入れておくと、別の管理者がその画面を開いたときに実行されうる状態だった(保存型XSS)。
- •修正: お知らせ窓に入るすべての文言(見出し・本文・ボタン・確認文)を、文字としてそのまま見えるよう変換してから入れる。
- •データベースに接続できなかったときの案内文も、翻訳文を使い同じ変換を通す。
お知らせ窓のボタンがどの言語でも韓国語で出ていた問題
- •「確認」「キャンセル」がJavaScriptに韓国語で埋め込まれていた。いまは表示中の言語で出る。
サーバーが現在の言語の文言を用意し、JavaScriptはその値を読む。
管理画面の文言を13言語に
デザイン(スキン)・メニュー・ページ設定の画面に韓国語で埋め込まれていた案内文を翻訳キーに置き換え、13言語を用意した。
- •スキン: 名前の変更・複製・削除の結果、「スキンのファイルと設定が完全に削除される」確認文、画像アップロードの結果
- •メニュー: システムページはメニューからのみ外れるという案内、「リンク先のページ(掲示板)も一緒に削除される」確認文
- •ページ設定: ファイル形式・保存失敗・URL重複の案内
v2.7.12
2026-09-19 · 1か月前
非公開記事の保護・初期表示の速度
非公開記事が一覧から漏れていた問題
非公開で書いた記事なのに、一覧ではタイトル・代表画像・抜粋がそのまま見えていた。 隠れていたのは本文だけだった。
- •修正: 一覧でも、投稿者・管理者・パスワードを通過した人だけがタイトルとプレビューを見られる。
- •添付ファイルのURLから中身を覗けた点も塞いだ。添付も同じ基準で確認する。
- •記事を読む画面の「前の記事・次の記事」のタイトルも隠す。
- •一覧を取り込むウィジェット(掲示板カード・グリッド・タブなど)は、非公開記事を初めから除いて取得する。
初期表示が遅かった問題
スマートフォンで最初の文字が出るまで時間がかかっていた。原因は書体だった。
- •書体のCSS(Google Fonts 152KB + Pretendard 29KB)が描画を止めていた。
いまはシステム書体で先に描き、ウェブフォントは届き次第差し替える。
- •Pretendard は韓国語の画面だけに読み込む。日本語の画面は日本語書体が先なので、断片だけ取得して捨てていた。
- •小さなCSS 2本(文字サイズ・掲示板本文)はファイルで呼ばず、画面に直接入れる。
- •初回訪問時に画面キャッシュ(Service Worker)のせいで文書を二度読みしていたのをなくした。
- •横スクロールメニューの幅計算を、ページの読み込み完了後に遅らせた(計算のために0.5秒止まっていた)。
検索ロボット・AIが言語別ページをたどれるように
- •言語切り替えのリンクを実際のURL(
?lang=…)に変えた。以前はJavaScriptのリンクで、検索ロボットがたどれなかった。
管理画面
- •ページ一覧で同じページが言語の数だけ何行も出ていたのを、1行にまとめた。
- •メニューのタイトルだけを直したのに、他言語の翻訳が消えていた問題を修正。リンク先のページを変えた場合だけ整理する。
- •ブログの予約公開に過去の時刻を入れるとそのまま保存されていたのを、案内を表示し、状態はそのままにするようにした(13言語)。
通知・文言
- •コミュニティのメッセージ通知の件名が韓国語で固定されていた。受信者の言語で届くようにした。
- •クッキー案内バーのリンク文字が暗くて読みづらかったのを明るくした。
内部整理
- •誤って二重にコピーされていた管理画面のフォルダ(
admin/site/site、admin/components/components)を削除した。
実際に使われているのは元のフォルダ側。配布版のビルドからもこれらを除外する。
サイトマップに非公開の掲示板が載っていた問題
管理者だけが見られる掲示板(受付箱など)のアドレスまでサイトマップに入っていた。
検索ロボットはそのアドレスで 403(アクセス禁止)しか受け取れず、非公開の掲示板があることも知られてしまった。
- •修正:非会員が見られる掲示板だけを載せる。一覧・記事の閲覧権限が「全体」の掲示板が基準。
- •秘密の投稿と、掲示板設定で検索除外(noindex)にした掲示板も外す。
- •掲示板と同じ名前のページは、掲示板側を基準に判断する。アドレスを掲示板が先に取るため。
- •多言語のページもサイトマップに載せる。
- •サイトごとに載せたくないページは、設定
sitemap_exclude に書く。llms.txt も同じ設定に従う。
送ったメールが迷惑メールに入ったり、差し戻されたりしていた問題
- •メールに 送信日時(Date)とメール固有番号(Message-ID)が入っておらず、受け取る側で迷惑メールと判定されやすかった。
両方を入れ、本文は base64 で送る。長い行が切れたり、行頭の「.」で本文が途切れたりする問題もあわせて防ぐ。
- •宛先が送信元と同じドメインの場合(例:会社のアドレスに送る控え)、そのドメインのメールボックスがなりすましと見なして拒否していた。
この場合に限り SMTP アカウントのアドレスから送り、返信は元のアドレスに届くようにする。
SEO・AI 検索の設定を強化
- •管理者の SEO 設定に運営者情報(構造化データ Organization)の入力欄を設けた。値のない項目は出力しない。
- •ページごとの SEO 設定を実際に使い、同じ内容が複数のアドレスで見られるときは代表アドレス(canonical)を決める。
- •Bing のサイト確認コードの入力欄を追加した。ChatGPT の検索は Bing の索引を使う。
- •説明文は検索結果の表示幅に合わせ、文の途中ではなく文の終わりで切る。
言語表示の整理
- •404 画面がいつも韓国語で表示されていた。今後は閲覧中の言語(日本語・韓国語・英語、その他の言語は英語)で表示する。
- •通知ベルの「たった今」が韓国語で固定されていたのを直した。
- •日本語の画面では日本語フォントを優先して使う。言語別フォントのヘルパーを常に読み込み、レイアウトを通らない画面(共有ページなど)もフォントのせいで止まらない。
- •マイページの「優先言語」に、文面のない言語まで並んでいたのを整理した。
- •会員登録のときに見ていた画面の言語を優先言語として保存する(これまでは空だった)。パスワード再設定メールもその言語で送る。
入力・ログイン
- •生年月日などの日付は年・月・日の3つの欄で入力する。以前はブラウザの言語によって表示が変わっていた。
- •スキンによって、ログイン・パスワード再設定で reCAPTCHA の検証が抜けていた問題を直した。
決済
- •決済代行会社(PG)ごとにテストキーとライブキーを2組保管する。テストモードは選ぶだけでよく、キーを入れ替えるうちに失うことがない。
ウィジェット
- •ヒーローウィジェットのボタンを新しいウィンドウで開けるようにした。
- •ウィジェットビルダーの繰り返し項目も言語ごとに書ける(地球儀ボタン)。
ビルド
- •設定ファイル(.env)とそのバックアップは、名前にかかわらず配布版に入れない。
- •編集中に残したバックアップファイル(
.bak、名前の後ろに日付が付いたものを含む)も入れない。
- •本社の運用だけに使うスクリプト(サイト同期・ホスティング・メールサーバー・規約更新など)と、配布版にないプラグインだけが使うクロンは、配布版から外した。お客様のサイトに必要な、アップデート・インストール・翻訳ワーカーなどのスクリプトはそのまま入る。
- •zip を作った後にもう一度検査し、設定ファイルやバックアップファイルが入っていれば公開を止める。
- •テスト用スクリプトはパスワードをファイルに書かず、設定から読む。
v2.7.10
2026-08-23 · 2か月前
アップデート後に版の名前が古いまま残る問題
アップデートしても版の名前・発売日が変わらなかった
番号だけが上がり、タイトルは前の版のものがそのまま残っていました。
管理画面に「2.7.9 · 日本語フォント · 契約更新のお知らせ…」のように、番号と名前がずれて表示されていました。
受け取ったものが何なのか、画面だけでは分かりませんでした。
- •原因:
version.json は、お客様ごとに異なる設定を守るために あえて上書きしない ファイルです。
そのためアップデーターが自分で書き込みますが、番号と時刻だけ を差し替え、タイトルと発売日はそのままでした。
- •修正: 新しい版のタイトルと発売日を 受け取ったパッケージから読み取り、あわせて反映します。
パッケージのない部分更新では、配布リスト(manifest.json)から読み取ります。
お客様ごとの設定(github など)はそのまま守ります。
注意 — この版に上げても、画面はまだ古い名前のままかもしれません。 アップデートを実行するのは
現在入っている 版のアップデーターだからです。2.7.10 を受け取った次の版から正しく表示されます。
ビルド検査
2.7.8 のビルダー停止(2.7.9 で修正)は、回帰テストをそのまま通過していました。
既存の検査が「ファイルがあるか · 文字列が入っているか」しか見ていなかったからです。
- •今後はビルダーに入るスクリプトを 実際に生成して構文検査 します(
node --check)。
- •JS 文字列の中に複数行のファイルをそのまま入れるコードがあれば、行番号を示して ビルドを止めます。
- •2.7.8 を再現したファイルで試し、検査が実際に検出することを確認しました。
症状
- •パレットに ウィジェットが一つも表示されない
- •すでに配置したウィジェットが キャンバスに描画されない — 動画・画像などを入れておいたものが消えたように見える
- •保存できない
原因
2.7.8 でフォントの宣言を partials/fonts.php の一か所にまとめました。ところがビルダーのプレビューを作る箇所が
JS 文字列の一行の中 で、そこに 33 行のフォント宣言がそのまま入ってしまいました。
改行が入った瞬間に文字列が途切れ、ビルダーのスクリプト全体が読み込まれる前に停止しました。
ファイルごと止まる種類の不具合なので、「一部の機能がおかしい」ではなく ビルダーが何もしない 状態になります。
2.7.5 以前にはこの問題はありません。
修正方法
フォントの定義は fonts.php の 一か所のまま にして、ビルダーに入れるときだけ出力を一行に畳み、引用符を処理します。
フォントを直す場所は、これまでどおり一つだけです。
既定のフォントを日本語基準に
これまで既定のフォントは韓国語基準でした。主な利用者は日本側なのに 画面が不自然に表示され、
言語を切り替えてもフォントは変わらず、日本語の文章が韓国語のフォントで表示されていました。
- •既定値を 見出しは明朝、本文は Pretendard JP に変えました。
- •言語設定画面で 言語ごとにフォントを個別に指定 できます。指定しなければ、その言語に合った既定値が適用されます。
- •管理画面・会員画面・フロントの全画面と、スキン(default・modern・minimal・shop)のすべてに同じ規則が適用されます。
契約更新・無償提供終了のお知らせ
契約の期限が 過ぎてから 気づくことがありました。更新日が近づくと事前にお知らせします。
- •更新予定・無償提供の終了を その日が来る前に 通知として表示します。
- •cron の一行(
cron.d-voscms-contract-notice)で動き、インストール案内に登録方法を載せました。
カード決済
日本のカード会社の認証(3-D セキュア)を通した決済が、認証だけ通って請求が拒否される 問題。
- •PAY.jp は、認証用に作ったトークンをそのままにしておくと使えないようにしています。認証通過後にサーバーが仕上げの呼び出し を
して初めて請求に使えるのですが、その一段階が抜けていました。
- •顧客情報が決済会社側に残っているかを 事前に確認 する道も開きました — 削除された顧客で請求しようとして失敗するケースを防ぎます。
通知ベル・返金規定の文言を多言語化
- •ヘッダーの通知ベルで「通知はありません」「分前」などの文言が 韓国語で固定されていた のを、言語別に切り替わるようにしました。
- •返金規定の案内文に残っていた固定文言を整理しました。
会計
日本法人の帳簿に ウォン建ての取引が混ざり込み、合計が合いませんでした。
- •帳簿通貨(円)と異なる通貨の伝票は 仕訳を作りません。 記録は残りますが、帳簿には載りません。
配布版の整理
- •編集中にできた バックアップファイルが配布版に載って出ていました(
ファイル名.php.bak.数字 の形)。
除外規則が .bak しか弾かず、数字が付いた名前を見逃していました。.bak.・.orig・*~ まで防ぎました。
- •THEVOS AI サービスの 販売資料(料金表・セット計算・決済整合 cron)を配布版から外しました。
読む側がすべて外れていたため、配布版では誰も使わないファイルでした。
v2.7.7
2026-08-10 · 2か月前
新規インストールで表示されていた二つの警告
「DB マイグレーションが必要です」
039_ai_knowledge_base は NaitoWork X の店舗相談用 AI のテーブルを作るものですが、
配布版にそのまま入って出荷されていました。しかもこのファイルの 最後の一行 が
ALTER TABLE rzx_shop_inquiries ADD COLUMN IF NOT EXISTS ai_meta ...
rzx_shop_inquiries は vos-store プラグインが作るテーブル です。
配布版に vos-store はありません — コアが、存在しないプラグインのテーブルを変更しようとしていたのです。
そのため新規インストールのたびに、テーブルが 4 つ作られて最後の行で失敗 → 最後まで行けなかったので
「適用済み」として記録されず → バナーが永久に表示され、押しても同じ場所でまた失敗します。
AI 相談(RAG)を配布からまるごと外しました:
039 · rzxlib/Core/AI/{Knowledge,Embedding,Generate} ·
scripts/{ai-kb-ingest,ai-rag-test,cron-ai-consult,hanesbot-ingest}.php
AI 翻訳(rzxlib/Core/AI/Translation)は残します。 これは有料の vos-ai プラグインの
エンジンであり、会計・ホスティングと同じく「エンジンはコアに置き、機能はプラグインが開く」という規則に従います。
「1 個のプラグインが未認証です(vos
コアは 「ライセンスなしでも使える同梱プラグイン」 の一覧を持っていますが、それが古くなっていました。
コードが知っていた同梱 | vos-autoinstall · vos-marketplace |
実際に出荷される同梱 | vos-autoinstall · vos-community |
vos-marketplace は配布から外れ、その代わりに vos-community が入りましたが、
この一覧だけ直していませんでした。 同梱しておきながら同梱だと認識できず、警告を出していたのです。
同じことが二度と起きないように
原因は 同梱の一覧が二か所に書かれていること です —
ビルドスクリプトの除外リストと LicenseStatus::BUNDLE_PLUGINS。
ビルドに 突き合わせの段階 を入れました。両者がずれると zip を作らずに止まります。
人間が覚えておくことではありません。
掲示板に書き込みボタンが表示されなかった
Q&A・FAQ で 書き込める人にもボタンがありませんでした。 原因は二つありました。
- •管理者が弾かれていた — 書き込み権限を確認する際、まず会員かどうかを調べ、管理者はその後で見ていました。
管理者は users にいないため、最初の関門で止まっていました。順序を入れ替え、管理者を先に通すようにしました。
- •投稿が一件もないとボタンも一緒に消えた — ボタンが一覧の中に入っていたため、
「投稿なし」の画面に切り替わるとボタンも一緒に消えていました。最初に書く人が書けない状態でした。
ボタンを一覧の外に出しました。
- •FAQ はそもそも
admin_id を直接見ていました — 掲示板設定の書き込み権限を無視していました。
掲示板のタイトル・サブタイトルが別の言語で表示された
韓国語の画面なのにサブタイトルだけ日本語で表示される問題。
- •翻訳をまったく読んでいなかった。 タイトル・サブタイトルはスキン設定に 文字列ひとつ として保存されますが、
翻訳は rzx_translations に別途あります。画面は保存された文字列をそのまま出力していました。
- •掲示板の区別がなかった。 翻訳キーが
skin_config.subtitle_text だったため、Q&A と FAQ が
同じ枠を共有していました。 片方を直すともう片方も変わってしまいます。
board.{掲示板番号}.{項目} に分けました。
- •ロケールが決まる前に本文が描画された。 コアは本文を先に作り、ヘッダーを後から付けますが、
言語はヘッダーで決まっていました。本文側で先に決めるよう移しました。
インストール時にコアのマイグレーションが抜けていた
install-core.php が database/migrations をまったく見ていませんでした。
新規に入れたサイトでは最初からいくつかのテーブルがなく、後でその機能を有効にしたときに落ちていました。
マイグレーションが黙ってスキップされる問題(2.7.4 の続き)
2.7.4 で一行コメント(--)を処理しましたが、複数行コメント(/ /)が残っていました。
そのブロック内のセミコロンのせいでファイルが一つの塊にまとまり、一行も実行されないまま
「適用済み」として記録されました。実際の被害を確認しました — あるインストールではテーブル 9 個がまるごとありませんでした。
文字列内の -- や /* はコメントではありません。引用符を数えながら取り除きます。
その他
- •ショッピングヘッダー — カテゴリのプルダウンの先頭に「すべてのカテゴリ」を入れました。
中に入って見て回りたい人の行き先がありませんでした。
- •ウィジェットビルダー — 繰り返し項目(
repeater)の編集を別ファイルに分離しました。
- •イントラネットのサイドバー — 会計の文言を三系統(サロン・ショッピングモール・一般企業)すべてで探します。
一つしか見ていなかったため、別の会計を使うとメニューに生のキーがそのまま表示されていました。
- •マイページ — ダッシュボードの整理。
- •有料プラグインの報告 — ライセンス確認に 有効にしている有料プラグイン も併せて送ります。
インストールしただけで有効にしていないものは送りません — お金は有効にしたものにだけかかります。
v2.7.5
2026-08-05 · 3か月前
配布版から本社専用のシステムページを削除
本社専用のページが配布版に載って出ていた
config/system-pages.php がまるごと配布版に入ってしまい、お客様のインストールの管理者「システムページ」に、
押せるのに何もないメニューが6つできていました。
📥 downloads | 配布版のダウンロード — 本社だけが配布します |
📋 changelog | 本社の製品履歴です |
📧 contact | お客様がウィジェットで自分で作ります(システムページではありません) |
💼 recruit · 💃 casts | ナイトワークポータル(NaitoWork X)専用 |
🎟 coupons | マーケットのプラグインが提供します |
- •ビルド段階
[4e/8] を追加しました(strip-system-pages.php)。削除した後に php -l で文法を検査します —
このファイルが壊れると、管理画面がまるごと止まります。
- •配布版に残るシステムページは8つです:home · terms · privacy · data-policy ·
refund-policy · hosting-terms · tokushoho · funds-settlement
プラグインのシステムページ
- •
site.pages.blog の文言を 13言語に追加しました。
プラグインがシステムページを登録しても、コアに文言がなければ、画面に site.pages.blog がそのまま表示されます。
- •(
vos-blog 自体の plugin.json の修正はマーケットから出ます — 配布版に含まれないプラグインです)
すでにインストール済みのサイト
管理者の「システムページ」に使わない項目が見えたら、config/system-pages.php から該当のブロックを削除してください。
ページの内容(rzx_page_contents)は削除されません — 一覧から消えるだけです。
v2.7.4
2026-08-05 · 3か月前
マイグレーションが黙ってスキップされていた問題
① コメントで始まるマイグレーションが、まるごとスキップされていた
- •
DatabaseMigrator::splitSql() のコメントには「コメントを除去してから分割」と書かれていましたが、
実際にはセミコロンで分割しているだけでした。
- •SQL ファイルの1行目が
-- 説明 だと、ファイル全体が1つの断片になり、
実行部の str_starts_with($stmt, '--') に引っかかって、1文も実行されませんでした。
- •実行が0件ならエラーも0件なので
success として処理され、適用済みとして記録されます。
記録が残ると再実行されないため、テーブルがないまま永久に固定されます。
- •被害の範囲は
-- で始まるすべてのファイルでした。実測:9個のうち6個が実行0件、2個が部分実行でした。
- •今は
--・# の行コメントと / / ブロックを消してから分割します。
文字列の中の -- には手を触れません('a -- b' のような値が切れるとデータが壊れるため)。
② 新規インストールが、増分マイグレーションをまったく実行していなかった
- •インストールスクリプトは
migrations/core と migrations/migrations だけを実行し、
最上位の database/migrations/*.sql を抜かしていました。 アップデータは逆に、最上位だけを追跡します。
- •そのため、新しくインストールすると 034〜042 が最初からなく、次のリリースが来るまで空のままでした。
- •インストール時に最上位も実行し、適用済みとして記録します(最初のアップデートが同じものをまた実行しないように)。
すでにインストール済みのサイト
管理者 → 設定 → アップデートで、マイグレーションの実行を一度押してください。
誤って記録されたものは再実行されないため、テーブルが空なら次で確認できます。
SELECT migration FROM rzx_migrations; -- 記録
SHOW TABLES LIKE 'rzx_home_notices'; -- 実際
配布版から外したもの
- •
vos-cp(サービスコントロールパネル)・vos-shopping(ショッピングモール)が、配布版に紛れ込んでいました。
どちらも新しく作ったプラグインで、除外リストに入っていなかっただけです。
- •
vos-cp は THEVOS 自社サービス用のパネルです。お客様のインストールにある理由がありません
- •
vos-shopping はまだ開発中(v0.1.0)で、プラグインはマーケットで購入するのが原則です
- •
vos-review も外しました — 同じ理由です(オーナーの指示)。
- •配布版に入るプラグインは2つだけです:
vos-community・vos-autoinstall。
それ以外はすべてマーケットから入手します。
コアに加えたもの
- •ショッピングモールの2段ヘッダー(
skins/layouts/shop) — 全カテゴリのプルダウン・検索・カートのプレビュー・
ログイン後のアバターメニュー。カテゴリのプルダウンの一番上に「全カテゴリ」を置いて、戻る道をつくりました
- •マイページにポイント・ストアクレジット・会員ランクを表示。名称は設定した値をそのまま使います
- •プラグインのウィジェット対応 — プラグインが
widgets/ を置くと、コアのビルダーが自動で認識します
- •郵便番号の住所検索の共通コンポーネント — 注文書と会員情報が同じものを使います
- •管理者のトップバーの通知ベル
- •管理コンソールのメニューグループの整備(
config/intranet-modules.php)
- •ウィジェットビルダーの繰り返しフィールド(repeater)に対応
修正したもの
- •多言語の入力フィールドが元データを上書きしていた問題
- •ストアクレジットの台帳の記録のバグ
- •配布版のアップデートがホスティングのページを 404 にしていた問題
インストール済みの環境で確認すること
古い配布版でインストールし、アップデートだけを受けてきたサイトには、使っていないプラグインのフォルダが残っています
(アップデートはプラグインのフォルダを消しません)。管理者 → プラグインで未インストールと表示されているものは、
plugins/ からフォルダごと削除して構いません。
v2.7.2
2026-07-26 · 3か月前
サービス申込のルーティング整理(コアの再ビルド)
Changed
- •サービス申込 URL の統合ルーティング —
/service/hosting・/service/mail・/service/domain → /service/order に 302 で接続(専用の申込ページが準備できるまでは統合申込ページへ案内し、のちに専用ページに差し替え可能)。
Notes
- •2.7.1 のコアの修正(多言語 hreflang・アップデータの黙った失敗の防止・料金
/pricing → /service/order の統合)は、2.7.1 のパッケージにすでに正しく含まれていました。2.7.2 は、その上にサービス申込のルーティング整理を加えた再ビルドです。
- •配布版には原則として純粋なコアのみを含めます(有料・バーティカルのプラグインを除外)。本社サイト(voscms.com・thevos.jp)は配布版の自己アップデートの対象ではなく、ソース/git で配布します。
SEO
- •多言語 hreflang — ページごとの自己参照 canonical + 対応言語の hreflang を自動生成、
?lang=xx による言語別のインデックス、既定言語の ?lang → bare URL への 301 正規化、sitemap の拡張。
Fixed
- •アップデータの黙った失敗を修正 — コアファイルや version.json の書き込み失敗を例外として処理します。権限不足などで適用に失敗したとき、「SUCCESS」の誤報ではなく、明示的なエラーと自動ロールバックになります。
- •料金ページの多言語フィールドが htmlspecialchars に配列として渡されて 500 でクラッシュする問題を防止しました。
Changed
- •reCAPTCHA v3 のフォームごとのトグルを拡張(blog_comment など)。
- •設定の「オーナーコンソール通知」タブは、vos-store が有効なときだけ表示します。
- •料金ページ
/pricing → /service/order に統合(301)、「システム無制限」プランは管理者専用。
配布構成
- •配布版を純粋なコアに精鋭化 — コアプラグイン3種(
vos-autoinstall・vos-community・vos-review)のみを同梱。バーティカル(ナイトワーク/サロン/POS)のプラグイン・ウィジェット・スキン(story)はすべて除外しました。年齢認証・クッキーバナーなどの汎用機能はコア(rzxlib)のため含まれます。
Added/Changed (コアウィジェット)
- •location-map — keyless の埋め込み(
map_embed)に対応して API キーへの依存を解消し、地図の言語をロケールと連動
- •practice-tabs(業務分野タブ) — 新しい同梱ウィジェット
- •グローバルなページ幅設定(
widget_page_width) — ウィジェット/ドキュメントページの幅を統一
非同梱(bundled:false)のサイト専用ウィジェット(hero-slideshow・overlap-cards・office-intro・page-hero・content-head・consult-cta・board-grid・clients-logos・board のプロフィールスキン)は、コアの配布版には含まれません。
Removed
- •プリペイドのウィジェット(
prepaid-charge・prepaid-pass・prepaid-purchase) — vos-prepaid が非同梱のため、配布から除外
Added (設定・コア)
- •年齢認証ゲートをコアの一般設定に昇格
- •クッキー同意バナーの背景の透明度の調整
- •言語別のロゴ画像
- •事業者情報に銀行口座情報 + 銀行振込の案内
- •決済画面の「ご利用可能なカード」の案内(ブランドアイコン) + 管理者設定
Fixed
- •ページのタイトル・サブタイトルの多言語ローカライズ(page-scoped db_trans)、content_width が適用されない問題を修正
- •ウィジェット/管理画面/ページの多数の不具合の修正と、13言語の拡充
Added
- •obsolete ファイルの自動整理 — フルパッケージの zip を上書きするアップデートは、ソースから取り除かれたファイルを消せないため、配布版に残骸(orphan)が残っていました(例:リファクタで分離・削除された一体型の
settings.php が古いインストールに残っていた)。これを整理する、明示的なリスト方式の仕組みを追加しました。
- •
config/obsolete-files.php — 削除対象のパスの累積リスト(複数のバージョンを飛ばしたインストールも一度に整理)。
- •アップデータの
applyUpdate() の直後に cleanupObsoleteFiles() がリストのファイルを安全に unlink します。保護対象(.env・storage など)、パスの逸脱、ディレクトリには決して手を触れません。
- •最初の登録:
resources/views/admin/settings.php。
v2.6.23
2026-06-02 · 5か月前
ダッシュボードの「システム設定」リンクの修正
Fixed
- •ダッシュボードの「システム設定」リンク — クイックアクションのリンクが、分離・削除されたレガシーのパス
/settings を指していて、誤った(フォールバックの)ページに移動していた問題。設定の標準の入口 /settings/general に修正しました。(2.6.22 のビルド以降の漏れ分)
Fixed
- •ダッシュボードの「DB マイグレーションが必要」バナー — CSRF token invalid — 再試行ボタンが
/update-api.php(run_migrations)に CSRF トークンを送らず、419 で拒否されていた問題。$_SESSION['csrf_token'] を確保し、ヘッダーと本文で送信するよう修正しました。
- •マイグレーションを実行してもバナーが消えない —
DatabaseMigrator::recordMigration が batch カラムと patch_ の接頭辞を前提にしていたため、インストール型のスキーマ(migration/version/executed_at)では記録の INSERT が失敗し、接頭辞のせいでファイル名の照合もずれていた問題。実際のカラムに合わせて、ファイル名をそのまま記録するよう修正しました。(2.6.20 のアップデート時に、マイグレーションが「OK」のログだけを残して適用されていなかった原因)
Fixed
- •管理者権限管理などのコアページのサイドバーに生のキーが出る問題 —
config/intranet-modules.php の route_prefixes だけでイントラネットの layout を有効にしていたため、該当プラグインがないサイト(例:vos-salon が未インストール)のコアページ /staff/admins が salon イントラネットのサイドバーで描画され、salon.intranet.、salon.section. のキーが生のまま表示されていた問題を修正しました。
- •共通ヘルパー
resolve_intranet_module() を追加 — モジュールの lang リソース(プラグイン)が実際にインストールされている場合にのみイントラネットを有効にし、未インストールならコアの admin-sidebar にフォールバックします。
- •
_head.php / admin-sidebar.php の重複していた検出ロジックをヘルパーに一元化しました。プラグインがインストールされているサイト(salon・store など)では動作は変わりません。
Fixed
- •ポイントレベルの保存エラー — 管理者のポイントモジュールでレベルを保存するときに
Unknown column 'group_id' エラーで失敗していた問題を修正しました。原因は、core/004 と migrations/019(v190) の point_levels/member_points のスキーマの衝突です(019 の CREATE TABLE IF NOT EXISTS が既存のテーブルに新しいカラムを追加できなかった)。
- •migration
034_point_system_schema_reconcile(最上位、アップデート時に自動適用):
- •
point_levels — group_id を追加、name に既定値を付与、level にユニークインデックス(アップサートの動作)。
- •
member_points — point/balance/total_accumulated/level を追加。
- •すべて additive(データ損失なし)で、既存のカラムや利用側(vos-prepaid など)に影響しません。
Added
- •購入ウィジェット3種 — 統合型(
prepaid-purchase、表示項目をすべて/チャージのみ/回数券のみから選択) + チャージ専用(prepaid-charge) + 回数券専用(prepaid-pass)。共通コンポーネント purchase-widget.php 1つで3つのウィジェットを動かし(重複ゼロ)、$ppOnly フィルターで分岐します。
- •商品の背景画像 — 管理者の商品の追加/編集モーダルにドラッグ&ドロップのアップロード(クリックでのアップロードも可)を追加し、マイページとウィジェットのカードに背景を適用します。migration 003
image_url。
- •商品名の多言語入力 + AI 翻訳 — 共通の
multilang-modal を再利用(地球儀ボタン)、rzx_translations を基盤に保存し、prepaid_name() で閲覧者の言語で表示します。AI 翻訳はコアの /api/translations エンドポイントを再利用します。
- •決済フォームにカード名義人の入力欄を追加しました(PAY.jp の
createToken に渡します)。
- •手動チャージの顧客選択 — user_id の直接入力から、名前/電話/メールの検索オートコンプリートに切り替えました(
customer_search アクション)。顧客状況の一覧も、user_id のハッシュではなく顧客の名前 + メールを表示します。
- •有効トグル — 商品の有効チェックボックスをトグルスイッチに変更しました。
Changed
- •購入ボックスを4列に — 商品カードのグリッドを 2→3→4 のレスポンシブに(
lg:grid-cols-4)、ウィジェット幅の max-w-3xl 固定を削除 → 配置コンテナの幅に合わせます。
Fixed
- •ウィジェットビルダーのパレット・メガメニューの高さ — ビルダーの行の高さを
calc(100vh - 88px) に確定して、左のカテゴリとフライアウトが画面の高さ分を自動で確保するようにし、メガメニューの項目の重なりを解消しました。
Added
- •
api/broadcast.php の link 検証 — スキームがなければ https:// を自動で先頭に付加(example.com → https://example.com)、filter_var FILTER_VALIDATE_URL を通らなければ 400 + field: 'link' エラー、500文字を超えると拒否します。
- •クライアント側のリアルタイム検証 —
type="url"、inputmode="url"、入力するとすぐに:
- •スキームなし → emerald の外枠 + ✓ + 「送信時に自動補完されます:…」の案内
- •ホストにドット(.)がない、または形式が崩れている → red の外枠 + ⚠ + 「正しい URL 形式ではありません」
- •正常 → emerald の外枠 + ✓ + 「有効な URL です」
- •クライアントも補完してから送信します → プレビューと実際の配信本文が一致することを保証します。
Added
- •セクションヘッダー:✉ メッセージ作成 / 📡 配信チャンネル — 視覚的なグループ化 + 説明文。
- •文字数カウンター(タイトル
0/255、本文 0/2000) — 70% 以上で amber、90% 以上で red に自動で色が変わります。
- •メッセージのプレビューボックス(点線の枠) — タイトル・本文・リンクを合わせて LINE でどう見えるかをリアルタイムで描画 + 全体の文字数
n/5000 のカウンター(4500 を超えると red)。
- •各フィールドの helper text:
- •タイトル:「会員のメッセージボックスと LINE 通知の両方に表示されます」
- •本文:「本文に URL を書くと、自動で短縮 + クリック追跡されます」
- •リンク:「本文の末尾に1行空けて自動で追加されます。本文にも書くと2回表示されるのでご注意ください」
- •リンク input の右側のステータスアイコン(
absolute) — ✓ / ⚠ をすぐに表示します。
Added
🔗 URL 検証ルール(5番目のセクションを新設):
- •
http:// / https:// で始まる必要があります → クリック追跡のトークン化
- •スキームがなければ自動で補完します
- •ホストにドットがない、または形式が崩れているものは拒否します
- •500文字の制限
- •例のボックス:
✓ https://voscms.com/event / ✓ example.com/page → 自動補完 / ✗ asdfasdf (ホストにドットなし)
Notes
- •本番(
voscms-com)と salon の同期が完了しました。API/UI/i18n のすべてがすぐに反映されます。
- •13言語 i18n:
community.broadcast.guide_url_、section_message、section_channels*、subject_hint、body_hint、link_hint、link_{invalid,autofixed,valid}、preview_{title,empty}。
Added
- •
/theadmin/community/broadcast のレイアウト変更 — 従来の単一カードを lg:grid-cols-3 に分割。メインの配信フォームは左の2列(lg:col-span-2)、右の1列にガイドボックスを新設(<aside>、sticky top-4)。
- •6セクションのガイド内容:
1. 📅 予約配信とは? — 未来の時刻に自動配信、夜間/週末/イベントでの活用
2. 🛠 使い方 — 4ステップ(対象を選ぶ → LINE にチェック → 予約にチェック → 送信)、番号バッジの UI
3. ⏱ 配信の精度 — 5分間隔の cron の説明 + 例のボックス(10:00 → 10:00〜10:05)
4. 🆚 即時と予約の比較 — 2つのモードの動作の違いをカード形式で
5. 📋 キュー待ちの確認 — /history?status=queued へのショートカットボタン
6. ⚠ 注意事項 — 30秒以上先であること、アプリ内/プッシュは予約不可、cron のないホスティングでは動作しないこと、UI からの取り消しは未対応
- •インディゴのグラデーション背景(
from-indigo-50 to-blue-50) — ガイドボックスがメインカードと視覚的に区別されながら、やわらかく調和します。
- •13言語 i18n —
community.broadcast.guide_* キー約20個(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Added
- •
/mypage/settings に「優先言語」カードを追加 — 14個のオプションの select(自動/13言語)。保存すると rzx_users.locale を UPDATE し、$_SESSION['locale'] にすぐに反映します。
- •Auth::loginUser の hook — ログイン時に
$user['locale'] があり、セッションの locale が空なら自動で埋めます。ユーザーがセッション中に手動で変更した場合は、その値を優先して保持します。
- •13言語 i18n —
auth.settings.language.{title,description,label,auto,hint,save,success,error_invalid,error_save}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
- •変更後、次のページから UI が会員の言語で表示され、管理者が自動配信ルールに
messages_by_locale を設定していれば、その会員には一致する本文が LINE で送信されます。
Added
/theadmin/community/broadcast/history の上部にカードを3枚新設(既存の4枚のカードの次):
1. 全体のクリック率(CTR) — SUM(rzx_broadcast_clicks.click_count) / SUM(rzx_line_broadcasts.recipient_count WHERE status='sent') × 100。大きな文字の emerald。
2. A/B テスト(直近30日) — variant IS NOT NULL の配信について、variant ごとの受信・クリック・CTR を集計。CTR が高い方の variant は emerald で強調します。
3. locale ごとの分布(直近30日) — source='auto_rule' AND messages_by_locale IS NOT NULL の配信に限り、ルールの messages_by_locale JSON のキーと broadcast の本文の先頭30文字を比較して locale を照合 → locale ごとの受信/クリック/CTR。ksort で並べ替えます。
- •13言語 i18n:
community.broadcast.stat_{ctr_title,ctr_breakdown,variant_title,variant_hint,locale_title,locale_hint,empty}。
Notes
- •
voscms-com と salon のツリーの同期が完了しました。新しい DB カラムはありません(Step 4 の migration 008/009/010 にすべて含まれています)。
- •locale ごとの照合ロジックは本文の先頭30文字を比較します — 変数置換後の本文が一致すれば、同じ locale グループとして数えます。本文が短すぎる場合や、変数置換ですべて埋まる場合は、照合率が下がることがあります(今後、broadcast の行に locale カラムを直接追加することも可能)。
Added
- •migration 010 —
rzx_auto_broadcast_rules.messages_by_locale JSON NULL + rzx_users.locale VARCHAR(10) NULL + idx_locale インデックス。
- •AutoBroadcaster::lineUserIdsWithLocale — LINE userId と会員の locale のペアを照会します。
users.locale カラムがない環境は lineUserIds にフォールバックします。
- •AutoBroadcaster::pickLocaleMessage — 優先順位:会員の user.locale → サイトの既定 locale(rzx_settings.locale) → JSON の最初のキー(すべてミスなら null → A の本文にフォールバック)。
- •AutoBroadcaster::fire —
messages_by_locale があれば会員ごとに locale が一致する本文を使い、なければ A/B の variant、それもなければ単一の A を使います。locale・variant・default が同じ本文なら、同じグループとして multicast します(効率化)。
- •管理者のルールモーダル —
<details> の展開で「多言語ルーティング有効」と JSON の直接入力。pretty-print で表示します。invalid_locale_json の検証。
- •13言語 i18n —
community.automation.locale_{toggle,placeholder,hint} + fields.messages_by_locale + error.invalid_locale_json(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Notes
- •Step 1〜4 の LINE 配信インフラが完成(2.6.9〜2.6.15):
1. Step 1 — CTA · utility stack · 手動配信 · ランク別 audience · 複数選択(7872c4b, 7c94a55, c4a3325)
2. Step 2 — 会員グループの自動分類(b24979c)
3. Step 3 — イベント自動配信ルール(60d47cd)+ 配信予約の cron(8cf02ad)
4. Step 4 — クリック追跡(79c99a84)+ A/B テスト(86e19b0b)+ 多言語ルーティング(今回)
- •本番(
voscms.com)に migration 010 を適用しました。users.locale は新しいカラムで、既存の会員はすべて NULL です(サイトの既定 locale を使用 → 従来と同じ動作)。
- •会員が自分の優先 locale を直接設定できるマイページの UI は、次のマイルストーンです。
- •cron の登録推奨:
/5 /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php、0 3 /usr/bin/php8.3 /var/www/voscms-com/scripts/recalculate-member-grades.php。
v2.6.14
2026-05-30 · 5か月前
A/B テスト(Step 4-B)
Added
- •migration 009 —
rzx_auto_broadcast_rules.message_template_b TEXT NULL、rzx_line_broadcasts.variant CHAR(1) NULL、rzx_broadcast_clicks.variant CHAR(1) NULL + インデックス (source_rule_id, variant)。
- •AutoBroadcaster::fire —
message_template_b が空でなければ、LINE userId を crc32 mod 2 で A/B に 50:50 で分割します。variant ごとに配信履歴を事前に INSERT(logQueued) → トークンの wrap → multicast → finalize。同じユーザーは、繰り返し送信しても常に同じ variant を受信します(ハッシュの一貫性)。
- •管理者のルールモーダル —
<details> の展開で「A/B テスト有効」オプションと variant B の入力。単純な単一配信が既定で、A/B は明示的なオプトインです。
- •ClickTracker — variant のメタ情報を伝播します。broadcast_clicks.variant カラムがあれば INSERT 時に埋めます。なければフォールバックします(migration 009 が未適用の環境との互換性)。
- •logQueued のフォールバック — variant カラムのない環境(migration 009 が未適用のとき)でも動作します。
- •13言語 i18n —
community.automation.ab_{toggle,placeholder,hint}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Notes
- •本番(
voscms.com)で、migration 009 の3つの ALTER を分けて実行しました。既存のルールは message_template_b=NULL です(単一配信の動作を維持)。
- •ルールの編集 → 「A/B テスト有効」の展開で variant B を入力 → 保存するだけで、次の発生から自動で A/B に振り分けられます。
v2.6.13
2026-05-30 · 5か月前
送信URLのクリック追跡 (Step 4-A)
追加
- •マイグレーション 008 (
rzx_broadcast_clicks) — token(8文字の base62、UNIQUE)、broadcast_id、source_rule_id、original_url(2048)、click_count、last_clicked_at、last_user_agent。同じ(broadcast_id, original_url)の組み合わせならトークンを再利用する。
- •
ClickTracker クラス — wrap($pdo, $siteId, $body, $meta) 本文の http/https URL を正規表現で抽出 → INSERT or 再利用 の後、/t/{token} に置き換える。consume($pdo, $token, $ua) トークン → 元の URL を返し、click_count を増やす。
- •ルート
/t/{token}(index.php:330)— 正規表現ルーターに入る。ClickTracker::consume → 元の URL へ 302 リダイレクト、なければ 404。URL トークンの検証([A-Za-z0-9]{4,16})。
- •自動送信ルールとの統合 —
AutoBroadcaster::fire() が送信直前に logQueued → broadcast_id を確保 → ClickTracker::wrap → multicast → finalizeBroadcast の順に動作。トークンと broadcast_id の結び付きを保証する。
- •手動送信との統合 —
api/broadcast.php の即時送信テキストを組み立てた直後に wrap。scripts/process-scheduled-broadcasts.php のキュー送信直前に wrap(broadcast_id を通知)。
- •トラッキングドメインの設定 —
rzx_settings.click_track_domain を優先し、なければ APP_URL。短縮ドメイン(例:s.voscms.com)も使える。
備考
- •本番(
voscms.com)にマイグレーション 008 を適用済み。
- •wrap/consume の統合テスト:本文の URL 2つ → 8文字のトークン2件を INSERT → consume を呼ぶと元の URL が返り、click_count が正しく増えることを確認。
Added
- •migration 007(
rzx_line_broadcasts):scheduled_at DATETIME NULL、processed_at DATETIME NULL のカラム + (status, scheduled_at) インデックス。scheduled_at NULL = 即時配信(従来どおり)、未来の時刻 = キュー。
- •
scripts/process-scheduled-broadcasts.php — cron のエントリポイント。status='queued' AND scheduled_at <= NOW() AND processed_at IS NULL の項目を50件ピックアップ → processed_at = NOW() で即座にロック(トランザクション) → audience の解釈(all / grade_N、broadcast.php と同じ) → LineMessenger の multicast を500人単位で実行 → 結果で status を更新します。cron の推奨周期:/5 *。
- •broadcast.php の UI:
[配信を予約] チェックボックス + datetime-local 入力。チェックすると既定値は現在時刻 + 1時間(ユーザーのローカル時刻)です。チェックなし/空欄なら従来どおり即時配信です。予約できるのは LINE チャンネルのみです(アプリ内・プッシュは即時配信のまま)。
- •api/broadcast.php:
scheduled_at の POST パラメータを処理します。未来の時刻(> NOW + 30s)で send_line の場合、LINE API を呼び出さずに rzx_line_broadcasts (status='queued', scheduled_at) を INSERT するだけで、レスポンスに scheduled: true, scheduled_at を返します。
- •13言語 i18n:
community.broadcast.schedule_{label,enable,hint,success}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Fixed
- •
rzx_line_broadcasts の実際のスキーマ(title、body、audience varchar(20)、recipient_count、status enum(queued|sent|failed))に合わせて、INSERT のカラムを訂正しました。以前は存在しないカラム名(message_text、recipients_count、sent_count、failed_count、audience_value、partial)で INSERT を試みており、フォールバックまで失敗して、自動配信の履歴が欠落していました。
Notes
- •本番(
voscms.com)にマイグレーション 007 を適用しました。dry-run で pickup が0件であることを確認しました。
- •本番(
voscms-com)と salon のツリーの同期が完了しました。.env は除外しています。
- •cron の登録はホスティング運用側の判断です(必要なら
/5 * /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php)。
Added
- •自動配信ルールのテーブル(
rzx_auto_broadcast_rules) — migration 005_auto_broadcast_rules.sql。site_id ごとにルールを分離し、trigger_type / trigger_filter(JSON)/ audience(all|grade_X|custom)/ message_template / is_enabled / fired_count / last_fired_at の各カラムを持ちます。
- •AutoBroadcaster ディスパッチャ(
rzxlib/Core/Notification/AutoBroadcaster.php) — 静的エントリポイント AutoBroadcaster::fire($triggerType, $ctx)。有効なルールとのマッチ → テンプレート変数の置換({{title}}, {{url}}, {{author}}, {{board_name}}, {{site_name}}) → audience の解釈(broadcast.php と同じロジック。is_default のランクには NULL の会員を自動で含める) → rzx_user_social_accounts で LINE userId を照会 → 500人単位の multicast → rzx_line_broadcasts に履歴を記録 → ルールの統計を更新。
- •掲示板の新規投稿の自動配信 hook(api-posts.php:184) — 投稿の INSERT 直後(非公開の投稿を除く)に
AutoBroadcaster::fire('board_post', [post_id, board_id, title, url, author, board_name]) を呼び出します。配信に失敗しても、投稿のレスポンスには影響しません。
- •管理者のルール管理ページ(
/theadmin/community/automation) — カードグリッドの UI。ルールの CRUD + オン/オフのトグル + トリガー別の色バッジ(board_post=blue, review_created=amber, reservation_created=green)。モーダルでトリガー / フィルター(JSON)/ 対象ランク / メッセージテンプレートを編集します。
- •rzx_line_broadcasts の出所追跡カラム — migration
006_line_broadcasts_add_source.sql。source('manual' | 'auto_rule')+ source_rule_id(INT)+ インデックス。自動配信の履歴を、手動配信と同じテーブルの中で区別できます。
- •plugin.json のルートとマイグレーションの登録 —
community/automation ルート、003 の後に 004/005/006 のマイグレーションを明記しました。
- •13言語 i18n —
community.automation.* キーのすべて(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。トリガーのラベル、フィールド、ヒント、成功/エラーのメッセージ、既定のテンプレート。
Notes
- •本番(
voscms.com)に 005/006 のマイグレーションを適用しました。ルールは未登録の状態です。
- •本番(
voscms-com)と salon のツリーの同期が完了しました。.env は除外しています。
- •Step 3-B(予約配信
scheduled_at + cron)は次のマイルストーンです。
Added
- •登録時に default ランクを自動で割り当て(
rzxlib/Core/Auth/Auth.php::register()) — 会員登録の直後に rzx_member_grades から is_default=1 のランクを照会して、新しい会員の grade_id をすぐに埋めます。member_grades テーブルがないサイト(レガシー・未設定)では try-catch で黙ってスキップします。既存の NULL の会員は、別の再計算スクリプトまたはボタンで埋めます。
- •CLI のランク再計算スクリプト(
scripts/recalculate-member-grades.php) — rzx_payments の決済合計 + rzx_reservations の予約数(テーブルがあるときだけ)を基準に、sort_order DESC で順に確認し、満たせる最も高いランクに割り当てます。ルール未設定のランク(min_spent=0 AND min_reservations=0)は自動でスキップ — 明示的なルールがあるランクだけが昇格の候補です。条件を満たさない会員は default にフォールバックします。
- •オプション:
--dry-run(実際の UPDATE なしでシミュレーション)、--user-id=UUID(特定の会員のみ)。
- •cron の例:
0 3 * /usr/bin/php8.3 /var/www/voscms/scripts/recalculate-member-grades.php
- •管理者の「今すぐ再計算」ボタン(
/theadmin/members/groups) — アクションバーにエメラルド調のボタンを追加。クリックすると確認モーダル → AJAX action=recalculate_grades → 結果(対象/昇格/降格/新規)の通知 → 自動でリロードします。スクリプトと同じロジックをインラインで含んでいるため、PHP CLI の権限がない環境でも動作します。
- •13言語 i18n —
members.groups.recalculate* キーを新設しました(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。recalculate、recalculate_hint、confirm_recalculate、recalculate_stat.{total,upgraded,downgraded,fallback}、success.recalculated、error.{no_grades,no_default_grade}。
Notes
- •本番(
voscms.com)で --dry-run → 実際の実行 → ルール補強後の再実行を検証しました。grade_id NULL の5人全員に Normal(default)が正しく割り当てられました。VIP/Gold/Silver はルール未設定のため、ルールを追加するまで0人のままです(意図どおり)。
- •本番(
voscms-com)と salon のツリーの同期が完了しました。.env は除外しています。
Added
- •会員向け LINE 友だち追加 CTA コンポーネント(
resources/views/components/line-friend-cta.php) — 5 variant(card / button / bar / side-tab / bubble)× 6 position(bottom-right/bottom-left/bottom-center/top-right/middle-right/middle-left)× 3 size、ユーザー指定の色、表示の遅延、24時間「閉じたことを記憶」(localStorage)。
- •変更可能な設定 UI —
/theadmin/settings/message-api の LINE チャンネルカードの下部に「LINE 友だち追加 CTA」セクションを新設。Basic ID、有効トグル、variant ラジオ、position セレクト、size、カラーピッカー、delay 入力。
- •5つのレイアウトに自動表示 —
skins/layouts/{default,modern,minimal,modern-copy-260413}/footer.php から自動で include されます。決済・サービス申込・インストールの流れのページでは自動でスキップします。
Added
- •新設コンポーネント
resources/views/components/utility-floating-stack.php — thevos.jp の cameron_plugin のデザインパターン(右端に 80×80 の正方形を積み重ね + 1px の間隔 + アイコンごとの強調色)。位置・サイズ・色は運営者が調整できます。
- •モードの両立 —
utility_stack_mode = separate(既定、各 CTA を単独表示) / unified(PWA + LINE をまとめて stack 表示)。統合モードでは LINE CTA の5つの variant の自動表示を無効にし、PWA インストールモーダルの自動トリガー(setTimeout/DOMContentLoaded のバナー)も無効にして、stack の PWA アイコンをクリックしたときだけモーダルが開きます。
- •将来の自然な拡張 — アイテム登録パターンにより、他のもの(Kakao チャンネル、WhatsApp、ニュースレター購読、ダークモード切替など)も、設定キーを追加するだけで stack に加えられます。
- •自動改行の保証 — インライン CSS
word-break: break-all; overflow-wrap: anywhere; max-width: 72px で、Tailwind の flex 子要素の幅の制限を回避します。CJK のラベルもボックス内で自然に改行されます。
- •13言語 i18n —
resources/lang/{13 locale}/messaging.php に line_cta. グループ(22キー)と utility_stack. グループ(12キー)。日本語・中国語は意味の区切りに空白(「アプリとして インストール」など)を入れ、自然な改行位置を保証します。
Added
- •
LineMessenger::broadcast(messages) + broadcastText(text) — 全友だちに一括配信します(最大5メッセージオブジェクト。LINE の配信上限は、受信者数 × メッセージ数だけ消費されます)。
- •
LineMessenger::multicast(userIds[], messages) — 指定した最大500件の userId に配信します(グループ単位の配信インフラ)。
- •
/theadmin/community/broadcast UI の強化 — 「LINE 友だちにも配信」チェックボックス(緑のバナー)を追加。プッシュ配信とは独立して、LINE の友だちに multicast/broadcast を自動で配信します。
- •会員ランク別の配信 —
rzx_member_grades を動的に読み込み、ランクごとのラジオオプションを自動表示します(色のドット + スラッグ + リアルタイムの件数)。audience は grade_<id> 形式です。
- •
is_default=1 のランクに grade_id IS NULL の会員を自動で含める — 登録時にランクが自動で割り当てられないサイトでも、default ランクの件数・配信に NULL の会員が自然に含まれます。
- •
rzx_line_broadcasts 配信履歴テーブル — site_id の分離、method(broadcast/multicast)、audience、title/body、recipient_count、line_request_id、api_status/error、status。配信時に自動で INSERT されます。
- •
audience=all のときは broadcast、それ以外は multicast を自動選択 — 対象ユーザーのうち user_social_accounts.line_friend=1 の LINE userId を集め、500件ずつのチャンクで配信します。
- •幅の統一 — broadcast.php の
max-w-3xl → max-w-7xl(ほかの管理画面と一致)。
- •13言語 i18n —
send_line_label/desc、audience_grade_group のキーを追加しました。
Changed
- •
resources/views/admin/dashboard.php — ヘッダーのコメント / pageTitle のフォールバック / RezlyX v... のアップデート通知バナーをすべて「VosCMS」に修正しました。
- •
resources/views/admin/partials/admin-topbar.php — ヘッダーのコメントを修正しました。
Fixed
- •
storage/.update_cache が古い current: "2.6.4" のキャッシュを保持していたため、v2.6.8 にアップデートしたあともダッシュボードに「新しいアップデートがあります」のバナーが表示されていた問題 — キャッシュを削除すると、次のリクエストで自動的に再計算されます。
- •dev → 本番の累積した変更が同期されていなかった — 今回のセッション以外にも、install-core.php(#1〜#7 の不具合パッチ)や version.json など多数のファイルが本番に同期されていなかった名残です。rsync で dev → 本番を一括同期しました(342ファイル変更 + 196ファイル新規、6.3MB、ユーザーデータ・
.env・storage/・uploads/・vendor/・.git/ を除く)。
Documentation
- •
docs/LINE_FRIEND_CTA_DESIGN_GUIDE.md — Part 3(統合 Utility Floating Stack の実際の実装)、Part 4(Phase 1 の配信運用の実際の実装)、Part 5(外部ユーザーのシナリオ — 複数選択配信の価値の分析)、Part 6(Phase 2〜4 の今後のロードマップ)を追加しました。約 631 行 → 920 行。
Regression Test
- •
utility-floating-stack.php と5つの line-friend-cta の variant partial ファイルの存在を検証します。
- •
LineMessenger::broadcast/multicast メソッドの存在を検証します。
- •
plugins/vos-community/migrations/004_line_broadcasts.sql マイグレーションファイルの存在を検証します。
- •13言語の
messaging.utility_stack. + community.broadcast.send_line_ キーの存在を検証します。
- •dashboard.php / admin-topbar.php に RezlyX の名残がないことを自動で検証します。
Fixed
- •vos-market ライセンステーブル統合 — 6つのAPIファイル(
install, purchase, issue, issue-reply, review, resolve-keys)が誤った {$pfx}vos_licenses を参照し、決済時に500 "Server error" が発生していた問題を解消。ライセンス検証を単一マスター vcs_licenses(vos-license-server 管理)に一本化。
- •
sync.php の検証なしマスター登録セキュリティホール除去 — 既存コードがvos_key検証なしで vos_licenses にUPSERTし、任意のライセンスキーをPOSTのみでマスターに自動登録できる脆弱性を解消。追跡は既存の rzx_mkt_sync_reports(per-item)が担当。
- •
migrations/007 廃止 — rzx_vos_licenses を作成していた誤設計マイグレーションを no-op(SELECT 1)化。理由と変更履歴をコメントに明記。
Added
- •統計4カード — 追跡サイト / 注意サイト(違反) / 複数ドメインライセンス / 長期未同期30日+。カードクリック=該当タブに切替。
- •違反タブ(アイテム単位行表示) — どの有料ウィジェットがどのドメインにライセンスなしでインストールされているかを一目で確認。価格・バージョン・vos_key・最終報告日表示。
- •複数ドメインタブ — 1つのライセンスキーが複数のドメインから報告されたケース(ライセンス違反の可能性)。
- •長期未同期タブ — 30日以上同期信号がないサイト(ネットワーク遮断・コード改ざんの疑い)。
- •違反判定の精密化 —
unknown_product(ユーザー自社開発と仮定)と無料(price=0)アイテムは違反判定から除外、マーケット登録済みの有料アイテムのうち unlicensed のみを違反とカウント。
- •自社ドメインホワイトリスト —
settings.mkt_owner_domains のJSON配列で運営者自身のドメインを違反/複数ドメイン/長期未同期カウントから自動除外(全体現況はallタブで確認可能)。
- •13ヶ国語 i18n — サイドバー・カード・タブ・案内文をすべて正式翻訳。
Changed
- •
settings/system/updates — インストール済みバージョン・最新バージョンカードの「RezlyX vX.Y.Z」を「VosCMS vX.Y.Z」に訂正。
- •
updates/ajax.php — DB名フォールバック 'rezlyx' → 'voscms'、User-Agent 'RezlyX-Updater/1.0' → 'VosCMS-Updater/1.0'。
Regression Test
- •vos-market 6ファイルに
vos_licenses SQL 残留なしを自動検証
- •
sync.php のINSERTセキュリティホール再発検出
- •
migrations/007 のno-op状態維持検証
- •アップデート画面3ファイルにRezlyX残留なしを自動検証
Fixed
- •
site_url の自動シード — install ウィザードが、ユーザーが入力した siteUrl を .env の APP_URL にしか書かず、DB の rzx_settings.site_url には入れていなかったため、新規インストールしたサイトの site_url に依存するすべての機能(自動インストール、SEO、メールのリンクなど)が壊れていた問題を解消しました。install-core.php の $settings 配列に site_url を追加しました。
- •
rzx_site_domains への自動登録 — install ウィザードが現在のインストールドメインを site_domains テーブルに自動追加していなかったため、SiteRouter がドメインを認識できなかった問題を解消しました。インストールしたドメインを site_id=1 の primary として自動的に INSERT します。
- •
.env の MARKET_API_URL の自動作成 — 新規インストール時に .env にマーケット API のアドレスがなく、InstallerService が呼び出し先を見つけられなかった問題を解消しました。既定値の https://market.voscms.com/api/market を自動で書き込みます(ライセンス単一マスター運用)。
- •マーケットの install API のテーブル名の誤り —
vos-market/views/api/item/install.php が、ライセンス検証のときに存在しない rzx_vos_licenses テーブルを照会していたため、すべての自動インストールが「Server error」の 500 応答になっていました。実際のテーブル vcs_licenses(ライセンスマスター、プレフィックスなしで固定)に修正しました。
- •widgets/plugins/themes ディレクトリの権限の自動設定 — install 後に PHP-FPM のユーザーがこれらのディレクトリに書き込めず、自動インストールが無言で失敗していた問題を解消しました。install ウィザードが setgid とグループ書き込みを自動で付与します(PHP の実行グループを自動検出して、外部環境の違いに対応)。
- •
install-handler.php の多段フォールバック — マルチサイト環境で site_url の照会が site_id のフィルターなしの LIMIT 1 のため不安定でした。SiteRouter → site_id=1 へのフォールバック → $_SERVER['HTTP_HOST'] という3段階のフォールバックで、どの環境でもドメインの認識を保証します。
Added
- •
InstallerService::installTheme() — type=theme の商品の theme.json を読み、requires に含まれる plugin/widget/skin を再帰的に install します。13言語の検証と冪等性(すでにインストール済みの項目はスキップ)を保証します。
- •
runPostInstall — テーマのインストール直後に post_install/settings.json / boards.json / pages.json のシードを自動実行します。ページ + ウィジェット配置 + 基本設定まで、丸ごと自動でセットアップします。
- •13言語の強制(
REQUIRED_LOCALES) — 多言語オブジェクト(name、description、ページの title、ウィジェットの config.title など)が13個のキーをすべて持っていて初めて正式に通過します。不足しているロケールは警告されます。
- •
vcs_licenses マスターの単一化 — すべてのライセンスの発行・検証は、本番のマーケット(market.voscms.com)を通じて管理します。dev/test 環境も同じマスターを使います。
Added
- •今回の6つの不具合を自動検証 — install ウィザードのシードロジック + ディレクトリ権限 + マーケット API + ライセンスサーバーへの到達性 + InstallerService の theme 分岐 + install-handler の多段フォールバックなど、13項目。
- •build-voscms.sh の自動実行フック — ビルドの最後に自動で呼び出します。FAIL が1件でも発生すると終了コードが 0 以外になり、配布をブロックします。同じ不具合が次のビルドで再発しても、すぐに検出されます。
Documentation
- •
docs/theme-package/THEME_PACKAGE_SPEC.md — VosCMS のテーマパッケージ標準(theme.json)を定義しました。サロン統合テーマの例 + post_install の詳細スキーマ + 13言語ルールを明記しています。
v2.6.6
2026-05-27 · 5か月前
アップデートのバックアップ重複を防止
Fixed
- •アップデートのバックアップは、バージョンごとに1つだけ保持 —
Backup::createFull() が、バックアップを作成する前に同じバージョンの既存バックアップを先に削除するよう変更しました。同じバージョンでアップデートやロールバックを繰り返すと、バックアップ一覧に同じバージョンが重複して溜まっていた問題を解消しました(アップデート直前の最新の状態のみを保持します)。
Fixed
- •配布版の
update-api.php の欠落を復旧 — ビルドスクリプトがアップデートのバックエンドである update-api.php を「dev ファイル」と誤分類し、配布版から削除していた問題。その結果、すべての配布インストールのアップデートタブが「File not found」で動作不能でした。ビルドの除外から解除し、配布版に正しく含まれるようになりました。
- •ログインセッションを認識できない問題(Unauthorized)を修正 —
update-api.php が既定のセッション保存先(/var/lib/php/sessions)を見ていたものを、index.php と同じ storage/sessions に合わせました。管理者としてログインしているのに Unauthorized が出ていた問題を解消しました。
Changed
- •Core のアップデートは自社の配布 manifest という単一窓口のみを使用 —
update-api.php から GitHub のタグ・トークン・診断の名残を削除しました(check が manifest の結果を GitHub のタグで上書きしていた経路を遮断)。マーケットプレイスには Core はありません(プラグイン専用)。
- •セキュリティ強化 —
update-api.php に CSRF 検証とマスター(オーナー)権限チェックを追加しました。
- •アップデート保護リストの整備 —
skins と config を保護リストから外しました。applyUpdate はコピーのみのため、配布 zip のコアスキンと config は更新され、zip にないお客様のカスタムファイルは保護されます。
Changed
- •重複していた「アップデートの確認」ボタンを削除 — ページを開くと自動で最新バージョンを確認します。
- •一時的なエラーのときにバックアップ一覧が消えていた問題 → セクションを維持して空の状態で表示します。
- •エラー時に
Unauthorized などの生のメッセージの代わりに、「現在最新バージョンをご利用中です」という案内を表示します。
Added
- •13言語の
um セクション を追加 — vos-community/lang/{locale}.php の全言語 (ko·en·ja·de·es·fr·id·mn·ru·tr·vi·zh_CN·zh_TW): follow·following·message·block·unblock·report·report_about·report_reason/detail/placeholder·reason_spam/harassment/inappropriate/other·report_submit/sent/failed·msg_title/placeholder/send/sent/failed·block/unblock_confirm·block/unblock_done·cancel·failed·network_error
- •
user-mention-menu.php の全面 i18n 化 — PHP HTML の韓国語ハードコーディングをすべて __('community.um.*') に置換、JS ランタイム文字列は UM_LANG = <?= json_encode(...) ?> で PHP オブジェクトとして emit、umT(key, name) ヘルパーで :name プレースホルダを置換
- •未ログインユーザーへのメンションメニュー許可 —
community-overlays.php のガード構造を再編: 管理者/API パスは全面ブロック、user-mention-menu は未ログインでも含める (フォロー・通報はログインへ誘導)、ページアクション・username ガードはログイン専用を維持
Changed
- •
boardPreloadUsers(array $rows) 関数を追加 (board/_init.php) — user_id リストを 1 回の IN クエリで一括ロード、$GLOBALS['_boardUserCache'] 共有キャッシュ
- •
boardAuthorMention() を拡張 — data-user-username·data-user-avatar 属性を追加 (ストーリー URL /story/{username} を正確に連結、アバター画像を表示)。プリロードキャッシュ HIT を優先、miss 時は lazy な単件取得
- •
board/list.php·board/read.php·skins/board/qna/_list-full.php — レンダリング前に boardPreloadUsers() を呼び、N+1 クエリを防止
Fixed
- •表示パーサの拡張 (
resources/views/system/changelog/index.php) — コードフェンス (``)、表 (|...|)、マークダウンリンク (text)、#### 小見出し、水平線 (---`) のレンダリングを追加。この構文を使う一部バージョン (2.4.1·2.3.8·2.3.7 等) がマークダウン原文のまま表示されていた問題を解消
- •バージョン別 locale フォールバック — 一覧全体を 1 言語で一括取得していたのをバージョン単位 (
現在のロケール → en → ko) に変更。どの言語で見ても全バージョンが漏れなく表示され、未翻訳のバージョンはフォールバック言語バッジで区別表示
- •ブロック境界の整合 (
rzxlib/Core/Changelog/ChangelogParser.php) — 日付のない ## [Unreleased] ヘッダが直前のバージョン (例: 1.5.0) に吸収される問題を防止 (すべての ## [ でブロックを分割)
Added
- •マイグレーション 056
dist_downloads テーブル (site_id・version・ip・user_agent・referrer・utm_*・is_bot・created_at)
- •ダウンロードエンドポイント
api/dist-download.php — 静的 /download/*.zip 直リンクの代わりに経由し、バージョン別/日別/流入(referrer・UTM)を集計してから 302 リダイレクト。ボットUAは分離集計、バージョンホワイトリスト(パス操作を防止)
- •管理者統計ページ
resources/views/admin/dist-downloads.php (マスター専用、13言語) — サマリーカード(合計/今日/7日/30日)・バージョン別バー・日別推移(30日)・流入経路Top10・UTM。自前のSVG/CSSチャート(外部ライブラリなし)
- •
download-hero ウィジェットのダウンロードリンクをカウントエンドポイントに変更
- •管理メニュー「ダウンロード統計」を追加 (config/admin-menu.php、マスター専用)
Added
- •
hero-cta-text — 上部テキスト(タイピング)領域。初期値は運用中の hero-cta2 と同一内容(13言語)、設定入力が優先
- •
hero-cta-button — ダウンロードボタン(最新版を自動検出+ダウンロード数集計、設定不要) + 任意のマーケットプレイスボタン(空ならボタン1つ)
- •設定フォームのラベル・初期値を13言語化(ビルダー
getLabel のオブジェクト対応)
- •ダウンロードボタンの色・背景を hero-cta2 と統一(#2563eb)
Added
- •パレットカードをキャンバスへドラッグして追加(SortableJS
pull:'clone' グループ + キャンバス onAdd で実ブロックに置換)。従来のクリック追加・↑↓/ハンドル並べ替えと併用
- •ドラッグ中はフライアウトを維持 + キャンバスのドロップゾーン強調(
wb-drop-active)
Changed
- •ウィジェット間のページラッパー余白を削除(
type-widget.php py-2 → 0)
- •コメントAI翻訳の同期処理を安定化 — nginx
fastcgi_read_timeout 150s(掲示板vhost)・PHP-FPM request_terminate_timeout 150・set_time_limit 150、OllamaProvider keep_alive 30分(モデル常駐でコールドロード解消)
- •メッセージAPI・ソーシャルログインのタブに Webhook URL・Redirect URI のコピーボタンを追加(13言語、非セキュアコンテキストのフォールバック付き)
Added
- •マイグ 036
partner_earnings / payouts に withholding_tax · consumption_tax · tax_basis カラム追加
- •マイグ 037
payouts に fx_rate · fx_amount · fx_currency カラム追加(USD 換算送金記録)
- •マイグ 038
vcs_developers.paypal_email カラム追加
- •ヘルパー
rzxlib/Core/Helpers/MarketTax::calculate() — 日本標準控除モデル
· 販売価格は税込(消費税込み)、マーケットが消費税を NTA へ直接納付
· freelance → 10.21% 源泉徴収控除 / invoice_eligible → 仕入税額控除処理 / no_invoice → 消費税未納付
· 未分類・未入力は freelance 強制(保守的: 少額払いは還付可、過払いは回収不可)
- •バックフィルスクリプト
scripts/market-tax-backfill.php — 既存 earnings/payouts を再計算(status='paid' 保護、--dry-run 対応)
- •精算 5 分割表示: 売上 → 手数料 → 消費税控除 → 源泉徴収(freelance)→ 実支給額
- •
rzx_mkt_settings 新規キー: min_payout_amount · consumption_tax_rate · default_commission_rate(全箇所で settings 優先、ハードコード fallback 廃止)
Added
- •
/theadmin/market/partners/payouts 精算モダル — prompt() × 2 + alert() → 単一モダル
· vcs_developers JOIN で銀行/支店/口座名義/口座番号/事業者種別/T番号を自動 prefill(PII enc: 自動 decrypt)
· 5 分割自動計算 + 日本税法根拠チップ(freelance_withholding 等)+ 条文明示(§204、インボイス制度)
· ページ内トースト通知、モダル閉じて自動 reload
- •運営国外口座の USD 自動換算(マイグ 037)
· Frankfurter API 自動為替レート(storage/cache 24h TTL)+ 管理者手動オーバーライド(銀行 TTS)
· 自動的に method=paypal を選択
· 外国人は入金口座カードを非表示、PayPal メールカードを表示(bank_country == site_country 基準)
- •開発者精算請求額の指定(
/mypage/developer/earnings)
· 残高全額払い → 金額入力 + 全額ボタン + 最低金額バリデーション
· 売上履歴 5 分割カラム、精算案内ボックス(事業者種別ごとの適用税法明示)
- •支払履歴に USD 換算・為替レート補足表示(管理者/開発者画面の両方)
- •売上推移グラフを SVG 棒グラフに置き換え(div 棒の視認性問題を解決)
Added
- •
tax_review_status ベースのロックポリシー(開発者プロフィール)
· not_submitted / rejected → 入力可能
· pending / approved → 編集ロック(鍵アイコン + 案内)
· rejected → 入力可能 + 「保存時に再審査キューへ入る」ヒント
· サーバー側防御 HTTP 423 Locked(UI 迂回を遮断)
- •
update.php 部分更新の安全化 — 送信されたフィールドのみ動的 UPDATE(以前: 全上書きで未送信フィールドが NULL 化するリスク)
- •公式確認サイト案内(管理者確認画面 + 開発者プロフィール)
· 🇯🇵 国税庁 法人番号公表サイト (https://www.houjin-bangou.nta.go.jp/)
· 🇯🇵 国税庁 適格請求書発行事業者公表サイト (https://www.invoice-kohyo.nta.go.jp/regno-search/)
· 🇰🇷 韓国 ホームタックス 事業者登録状態照会
· 事業者番号/T番号の横にワンクリックコピーボタン
Added
- •新規登録(
/mypage/developer)— 国籍選択をフォーム最上部へ移動、運営国比較案内
· country == site_country → 🏠 国内者フォーム(事業者種別/銀行口座)
· country != site_country → 🌐 外国人フォーム(自動 freelance + PayPal メール必須)
· Alpine.js isDomestic ゲッター、OPERATING_COUNTRY グローバル定数
- •プロフィール編集(
/mypage/developer/profile)— 同一構造([feedback_admin_user_parity] ルール)
· 外国人: 事業者セクション非表示、精算情報 = PayPal メールのみ
· 国籍ロック(変更は管理者へ問合せ)、上部にモードチップ表示
- •register API サーバー側強制 — 外国人 paypal_email 必須、freelance 強制、事業者/口座入力値を無視
Added
- •
page.php トークン自動置換 — 全システムページに一括適用
· {{COMPANY_NAME}} {{COMPANY_ADDRESS}} {{COMPANY_PHONE}} {{COMPANY_EMAIL}} {{COMPANY_REG_NUMBER}} {{COMPANY_REPRESENTATIVE}}
· {{SITE_NAME}} {{SITE_URL}} {{DOMAIN}}
· 管理者の business_ または site_ settings から自動マッピング
· カスタム page_title / page_subtitle もトークン置換を通過
- •
{{DOMAIN}} 優先順位 — official_domain(規約・ポリシー用公式ドメイン)→ site_url ホスト
· 開発サーバー vos.21ces.com でも規約本文には voscms.com 表記を維持
Added
- •
rzx_page_contents の terms / privacy(各 13 行)を全面置換 — RezlyX 予約規約 → VosCMS 無料ソフトウェア利用規約
- •利用規約 18 条項: 目的・定義・掲示と改定・規約外準則・契約締結・個人情報・通知・会社義務・ユーザー義務・サービス提供・変更・利用制限・ライセンス(無償使用許諾)・データ所有・保存・投稿著作権・免責(AS-IS)・損害賠償・紛争調整
- •個人情報処理方針 10 条項: 処理目的・項目・保有期間・第三者提供・委託・情報主体の権利・安全性確保・Cookie・保護責任者・権益侵害救済(PPC)・変更
- •日本法 + 福岡地方裁判所専属管轄、APPI §33·§34·§35 引用
- •会社情報はトークン使用 → 管理者で一度修正すると規約・ポリシーが全自動同期
- •日本語版を正本と明示、13 言語で自国語正式翻訳
- •会社情報カード — 法人名・所在地・電話の 3 点のみ(代表者名削除、登記変更時の規約改定負担を回避)
- •保存スクリプト:
scripts/voscms-terms-update.php · scripts/voscms-privacy-update.php
Fixed
- •
/theadmin/site/menus の menus-api.php が vos より 99 行遅れており、メニューの保存・編集時にバリデーション・翻訳が欠落
- •vos → market へ menus-api.php を同期:
· mn_link_target_exists() — shortcut(リンク)メニューは対象ページ(システムページ・rzx_page_contents)の存在確認後のみ保存
· メニュー ID 再利用防御 — 新メニュー ID の stale rzx_translations.menu_item.{id}.* を自動クリーンアップ
· 翻訳 INSERT 方式 INSERT IGNORE → INSERT … ON DUPLICATE KEY UPDATE(上書き可能)
· title・url 変更時に旧翻訳をクリーンスレート化し、システムページ(config/system-pages.php)にマッチした場合は翻訳を自動再登録
- •
sync-to-market.sh INCLUDES に admin/site/menus*.php 4 ファイルを追加
Fixed
- •
rzx_contact_messages テーブル欠落 → マイグ 041_create_contact_messages.sql を追加(IF NOT EXISTS、vos でべき等 no-op を確認)
- •
contact-messages.php の二重レイアウト解決 — _head.php がすでに sidebar+topbar まで出力しているのに view が直接 include しており <body> が 2 回 + main が二重に。vos パターン(ヘッダー=_head 1 回、フッター=_foot 1 回)に整理(market 単発パッチ)
Added
- •マイグ 040
040_create_developer_platform.sql — vcs_developers + vcs_developer_earnings/payouts/activity/notes + vcs_review_queue + rzx_mp_items の 7 テーブルを一括作成(IF NOT EXISTS、030~038 ALTER 適用後の最終スキーマ反映)
· vos.21ces.com の vcs_developers は別途 CREATE TABLE マイグなしで dump のみに存在していた — 後続サイトで 030 の ALTER が失敗する問題を解決
- •
mypage/profile-sidebar.php 同期 — 旧 rzx_mkt_partners 照会 → 新 vcs_developers 照会(マイページ内で開発者活動を統合)
- •market
index.php ルートパッチ(手動、全体 sync 回避):
· /developer/ → /mypage/developer/ 301 リダイレクト(login/dashboard/my-items/submit/earnings/profile/logout マッピング)
· mypage/developer/{register|items|items/new|earnings|profile} + mypage/developer/items/{N} + mypage/developer/items/{N}/edit ルート
- •
sync-to-market.sh INCLUDES にマイグ 040 + profile-sidebar.php を追加
- •market DB 自動バックアップ(
storage/backups/market-YYYYMMDD-HHMMSS/market_vos.sql)後、040 適用完了
Added
- •market.21ces.com はマーケット運営(3 者)モデルのため VosCMS 無料ソフトウェア利用規約とは別に作成
- •利用規約 18 条項(マーケット運営規則を反映):
· 第 8 条 売買契約は購入者–開発者間で成立、会社は決済・引渡しの仲介
· 第 9 条 デジタル商品の返金 4 つの例外(ダウンロード前・説明不一致 7 日・マルウェア確認・システムエラー)— 特定商取引法 §15-2 表示要件を充足
· 第 10 条 精算 — 手数料 % を明示しない(「現行料率は別途掲示」参照方式、料率変更時に規約改定手続き不要)
· 第 10 条 日本所得税法 §204 源泉徴収 10.21% / T 番号保有事業者の消費税はマーケットが NTA へ直接納付 / 運営国外口座は USD-PayPal 送金
· 第 14 条 開発者個別規約優先適用 — マーケット運営事項(決済・精算・返金手続き)を除き個別規約が本規約に優先
· 第 17 条 損害賠償限度額: 直前 6 ヶ月の手数料/精算金合計
· 第 18 条 日本法 + 福岡地方裁判所専属管轄
- •個人情報処理方針 12 条項(3 者マーケット観点):
· 処理項目 — 共通/購入者/開発者(共通)/日本在住/海外在住/配送の 6 分類
· 保存期間 — 会員 1 年・取引 7 年・精算/源泉徴収 7 年・本人確認 5 年・ログ 6 ヶ月・問合せ 3 年
· 業務委託 — Stripe・KOMOJU・PayPal・Frankfurter・SendGrid・NTA を明示
· 国外移転 — 米国(PayPal/Stripe/SendGrid)・EU(為替レート)・その他国(地域 PG/銀行)を明示
- •スクリプト:
scripts/market-terms-update.php · scripts/market-privacy-update.php(UPSERT — UPDATE 後 row なければ INSERT)
- •market DB 適用完了(rzx_page_contents terms/privacy 各 13 行)、page-i18n 多言語タイトル・サブタイトルも同時適用
Added
- •スキン設定値(
page_title · page_subtitle)のマッピング欠落を修正 — 設定画面の入力がページに表示されなかった問題を解決
- •欠落していた
_page-title-bg.php パーシャルを新規作成(以前の nginx エラーログの include warning を解決)
- •
title_bg_type に color オプション追加 + title_bg_color フィールド — 画像・動画が空の場合に色フォールバックを自動適用
- •
content_bg=transparent の場合の白カードボックスフォールバックを削除(max-w-5xl 本文がカード内で狭く見えていた問題を解決)
- •
--page-content-width CSS 変数の自動出力 — 「このページについて」アクションバー(vos-community)等の外部自動インクルードコンポーネントがページの content_width と同じ幅で整列
Fixed
- •精算ページ PDOException —
rzx_mkt_partners に存在しない p.currency カラム参照を削除
- •売上推移グラフが表示されない問題 — div 棒の % 高さが環境によってほぼ 0px になっていた → SVG viewBox ベースのチャートに置き換え(最小 4px の視認性を確保)
Added
- •開発者マイページ アイテム詳細画面(
/mypage/developer/items/{id})— 統計・リリース履歴・ダウンロード推移
- •開発者 アイテム編集画面(
/mypage/developer/items/{id}/edit)— items-new と同じ 3タブ UI、既存値を事前入力、新規 ZIP アップロードは別フローを維持
- •新規 API:
/api/developer/item-update — name(JSON)・short/desc(JSON)・tags(JSON)・price・license・repo/demo URL・依存関係・最小バージョン・icon・screenshots を更新
- •新規 API:
/api/developer/request-payout — 精算リクエスト
- •新規 API:
/api/developer/update-bank — 本人の精算口座を更新
- •新規 API:
/api/developer/issue-reply — Q&A 回答を投稿(開発者本人の応答チャンネル)
- •管理者 開発者詳細画面(
/theadmin/developers/show)— 事業者/口座/書類カード + 書類審査(承認・却下)モード
- •会員登録・ログイン メール認証(
/verify-email)強化 + Auth::register の company フィールド保存
- •13言語 正式翻訳キー追加(
show_edit_btn, items_edit_*, items_back_detail, api_updated など)
Added
- •ウィジェット内でレビュー・イシュー・Q&A の投稿フォームを直接表示(別ページへの遷移不要)
- •投稿可能なのは購入者のみ — 非購入者にはフォームを表示し、投稿時にお知らせメッセージ
- •Q&A 回答にスレッド(返信)対応 — DB マイグレーション 035(
parent_reply_id)
- •新規 API:
/plugins/vos-market/views/api/item/post-issue.php, post-reply.php, post-review.php
- •コア
rzxlib/Core/Helpers/Notifications.php — 通知ヘルパー(DB マイグレーション 034 と対応)
Added
- •
/theadmin/market/licenses・sync・orders・settings・submissions・partners/payouts・items 全画面に13言語を適用
- •マーケット settings 画面 — "パートナー" ラベルを "開発者" に統一(表示テキストのみ、変数名は互換性維持)
- •マーケットのアイテム名入力に 共通多言語入力モーダル を適用 —
name_json で13言語同時編集
- •
plugins/vos-market/lang/* — プラグイン単独の言語プール(新規)
- •
resources/lang/*/marketplace.php — 13言語すべてを自国語で翻訳(i18n 完全翻訳ルール準拠)
Added
- •
033_developer_notes_activity.sql — 開発者ごとのメモ・アクティビティログ
- •
034_notifications.sql — rzx_notifications テーブル(ユーザー通知)
- •
035_issue_reply_thread.sql — rzx_mkt_issue_replies.parent_reply_id カラム追加(スレッド返信)
Fixed
- •
/Market?item={slug} スラッグが欠落 — items-show で専用の単一カラムクエリに修正
- •アイテム更新 API の
icon_url カラム名を実際のカラム icon に修正
- •マーケット settings ページが空白 —
rzx_mkt_settings のマイグレーション 005 の漏れを適用
Added
- •VARCHAR(12)
users.username + UsernameValidator(6文字以上、特殊文字制限)
- •ログイン後の初回訪問時にゲートモーダルを表示(AJAX
/api/username-set)
- •13言語の正式翻訳(英語フォールバック廃止)
Added
- •
/profile/{uuid} → /story/{username} 301 リダイレクト
- •コンテキストメニューラベル「プロフィールを見る」→「ストーリーを見る」
Added
- •コアから分離した vos-story プラグイン —
/story/{username} 専用
- •Facebook スタイルのヘッダー + 5固定タブ(すべて / 情報 / 写真 / フォロワー / フォロー中)
- •投稿 CRUD + SNS フィード(
vos_story_posts, body_format = text/html)
- •TEXT/EDIT トグル + Summernote 統合
- •画像添付(複数)+ 写真タブグリッド
- •いいね + コメントシステム
- •Story スキンシステム(
skins/story/default)+ ユーザー別トークン(/mypage/story)
- •管理者運営ポリシーページ(
/admin/vos-story/policy)
- •ページアクションバー: i18n + 位置(メインコンテンツ末尾)+ コンテンツ幅トークン
- •2:1 グリッド(コンテンツ領域のみ)— 右側: 広告 + 友達(フォロワー/フォロー中タブ)
- •ヘッダーアクションボタン — アイコンのみ([マイ Story 設定] / [プロフィール編集] / [フォロー])
Added
- •D-1: 4メニューサイドバー(ダッシュボード / ストーリー / 会員情報 / メッセージ)
- •D-2-A: ダッシュボード新設 — 8ステータスカード + 8タブナビ + 会員情報タブ
- •D-2-B: スクラップ / メッセージボックス / 友達タブ(各「すべて見る」リンク)
- •D-2-C: 保存済み / 投稿 / コメントタブ(掲示板 + Story + ページ統合)
- •D-2-D: 自動ログイン(remember tokens)管理
Added
- •共通ヘルパー
rzx_mirror_external_images() — cURL + SSRF 防御 + GD リサイズ
- •E-1: スクラップスナップショット取得 + 外部画像吸収
- •E-2: Story 投稿時に吸収(story_attachments source カラム)
- •E-3: 掲示板投稿時に吸収
- •E-4: ページコンテンツ作成時に吸収
- •画像マーキング:
data-source-original, data-source-mirrored
Added
- •ホスティング管理サイドバー最後の [設定] — サービス申込ページの4タブ(general/domain/hosting/addons)へ移動
- •返金ポリシー → システム設定 → 一般 → 独立カード に分離(課税設定と分離)
- •
rzx_settings.refund_policy 単一キー保存
- •13言語
settings.refund.* キー
Added
- •マイグレーション 009:
page_contents.created_by / updated_by カラム
- •すべてのページ編集画面(admin/customer/system)で自動記録
Added
- •投稿数カウント — 掲示板は
rzx_translations(board_post.{id}.title)の分離構造を認識
Added
- •管理者設定でホスティング別容量上限 / 警告しきい値 / ポリシー(block/notify/none)
- •マイページ使用量ドーナツチャート
- •
scripts/db-quota-monitor.php バックグラウンドモニター
Added
- •VosCMS 再インストールボタン — 管理者ホスティングタブ
- •ホスティング [ステータス] 変更アクション + ログ
- •「サーバー接続情報の設定」編集フォームを削除(不要な露出を防止)
Fixed
- •スクラップ
add_scrap ネットワークエラー — vos-story API ファイル require 競合
- •スクラップカード — アウトライン + 削除・編集アイコン(ゴミ箱)
- •投稿数とリストの不一致(status フィルタ漏れ)
- •nick_name マッチング削除(user_id が NULL のシードデータの誤認を防止)
- •マイページのストーリーメニュー位置 — top → main(プラグイン自動認識)
- •ストーリーメニューアイコンをコア形式に(full
<path> タグ)
- •付加サービスタブの settings SELECT で key カラム漏れ(2セクション非表示)
- •hosting_status アクション 500 — ヘルパー関数の定義位置
- •ページアクションバー — コンテンツ幅トークンの適用
- •新規投稿時に既存投稿が消えるバグ(フィードの即時更新)
Added
- •ホスティング詳細 → ドメインタブ →
+ ドメインを追加 ボタン → モーダル
- •オプション: 無料サブドメイン / 新規登録 / 保有ドメイン接続
- •WHOIS検索(
/api/domain-check.php 再利用)+ TLD別価格表示
- •決済: 保存済みカード(ホスティングの PAY.JP カスタマー再利用)または新カード(PAY.JP Elements)
- •消費税10% 自動分離(小計 / 消費税 / 合計)
- •決済完了時にホスティング sub の
metadata.added_domains[] に追記(別sub は作成しない)
- •自動返金セーフネット — DB処理失敗時に PAY.JP チャージを自動返金
Added
- •開始日〜有効期限 + 確認ボタン(DNS A/CNAME → 自社ゾーンまたは Cloudflare IP 帯域のマッチング)
- •自動更新トグル + 更新申請ボタン(ドメイン単位)
- •registrar_pending / manual_attach_pending 時は確認ボタン → 「準備中」バッジ
- •「追加ドメイン」紫色バッジ
Added
- •ホスティング管理サイドバー 2番目の項目を新設
- •統合一覧: type='domain' sub + ホスティング sub.added_domains[] をすべて時系列で表示
- •統計カード(全体/処理待ち/完了)+ フィルター(状態・オプション・検索)
- •アクション: [登録完了] / [キャンセル処理](キャンセル時: PAY.JP 返金 + 返金 row INSERT)
- •ユーザー名自動復号
Added
- •ホスティング管理サイドバー 3番目の項目を新設
- •
rzx_payments 基準の取引元帳 — 売上/返金/純売上/消費税 統計カード
- •日本の消費税申告用の本体分自動計算(税込表記 → 本体 = total × 100/110、消費税 = total × 10/110)
- •最近12ヶ月の推移表 + 取引元帳テーブル + フィルター/ページネーション
Added
- •マイページの追加サービスタブに「申込可能」セクション(ビジネスメールは自動除外)
- •価格別アクション:
- •無料(インストール支援): admin 通知 + order_logs
- •見積もり(カスタマイズ): 「見積もり依頼」
- •定価 recurring(1年技術サポート): カード決済モーダル(
_addon-pay-modal.php)
- •決済完了時に addon sub を自動作成 + payments 伝票
- •すでに有効な sub のラベルと一致する場合、申込ボタンを自動無効化
- •install_info 行の右側に [管理画面へ / ホームページへ] ボタン
Added
- •DB スキーマ:
uk_payment_order UNIQUE 削除 → uk_payment_key(charge_id)UNIQUE に交換
- •1つの order に複数の決済 row を許可(ホスティング + ドメイン + 追加サービスの累積)
- •返金時: paid row は変更せず、別途 refund row INSERT(status='refund'、会計整合性)
- •日本の7年保存義務 + PAY.JP 加盟店紛争対応標準を満たす
Added
- •composer require minishlink/web-push
- •VAPID ベースの admin/supervisor プッシュ送信ヘルパー
- •期限切れエンドポイントの自動クリーンアップ + rzx_push_messages の自動記録
- •呼び出し箇所: pay_domain(ドメイン決済完了)、service-order(ドメイン登録申請)、request_addon
Added
- •自社ゾーンのサブドメイン自動マッチング(ワイルドカード CNAME 認識)
- •Cloudflare IPv4 の15 CIDR 帯域マッチング(プロキシ応答時)
- •"already_refunded" 応答を成功として正常処理(PAY.JP が既に返金済みの場合)
Added
- •サブクエリで
rzx_payments 合計を照会(paid − refunded)
- •ホスティング基本決済 + ドメイン追加 + 追加サービス決済の累積表示
Added
- •
admin_cancel_addon — sub の status='cancelled' + PG 返金 + 返金 row INSERT
- •PG ルーティング: payment row の
gateway カラム基準(PG 変更後も安全)
Removed
- •日本の7年保存義務 + PAY.JP 紛争対応ポリシーに従い、管理 UI の「削除」をすべて除去
- •ゴミ箱アイコン + adminDeleteAddon JS + admin_delete_addon API + 13言語4ラベルをすべて除去
- •「キャンセル(Cancel)」のみ使用 — データ row は絶対に DELETE しない
Fixed
- •Translator プレースホルダーのコロンプレフィックス競合 —
[':count' => N] → ['count' => N] を一括修正
- •PayjpGateway::refund() の
metadata[refund_reason] が PAY.JP に拒否される → refund_reason に変更
- •service-manage.php の管理者権限チェック —
role === 'admin' → role IN ('admin','supervisor') を5アクション一括修正
- •サービス注文ドメインタブの返金後: 会計カードが負数表示 → SQL ロジックを修正(status='paid' / 'refund' 分離合算)
Added
- •ssh.21ces.com の Cloudflare Tunnel 登録(Public Hostname: SSH → localhost:22)
- •外部PC:
cloudflared access ssh --hostname ssh.21ces.com または ~/.ssh/config の ProxyCommand
- •サーバー側: PermitRootLogin no、thevos キー登録済み
Added
HostingProvisioner.php installVoscms() が zip デプロイ後に install-core.php を step 3 → step 4 の順に呼び出すよう変更(以前は step 2 のみ):
- •新規
runInstallCoreSteps() — _db POST フォールバックを利用したセッション回避 + .installed マーカー検証
- •新規
callInstallCore() — HTTP ループバック(port 80、Cloudflare エッジ SSL を活用;レートリミット時の origin 証明書未設置に対応)
- •新規
appendHostingEnv() — install-core.php が .env を上書きした後に HOSTING_* 変数を再注入
- •自動インストール完了時に welcome.html を自動削除(VosCMS の index.php が優先されるよう)
- •決済フロー service-order.php:567-576 — インストール成功時に addon metadata の
install_completed_at、install_admin_url を自動記録(マイページタブの表示トリガー)
Added
admin/service-orders/detail.php:175-260 + partials/addon.php:
- •付加サービスタブの「インストールサポート」addon に 2 つのボタン:
- •VosCMS インストール(紫)—
install_info があり install_completed_at がない場合に表示
- •管理者ページ(緑)— インストール完了後に admin URL を新しいウィンドウで開く
- •API アクション
admin_run_voscms_install — HostingProvisioner.installVoscms() を直接呼び出し、DB 認証情報は metadata.server.db または顧客 .env からフォールバック
- •インストール成功時: addon metadata +
voscms_installed order_log を記録
Added
customer/mypage/service-partials/hosting.php:
- •🟢 サイトバックアップボタン —
service-manage.php?action=request_backup(新規)
- •mysqldump → DB ダンプ + zip(public_html, .env, sql) パッケージング
- •署名付きダウンロード URL(HMAC、10分有効)— api/backup-download.php 新規
- •7日以上経過したバックアップを自動削除
- •🟣 phpMyAdmin を開く —
https://pma.voscms.com/?lang=<user_locale> を新しいウィンドウで開く
- •nginx vhost: pma.voscms.com.conf 新規(Cloudflare Tunnel
*.voscms.com ワイルドカードで自動ルーティング)
- •ユーザー自身の DB 認証情報でログイン
- •DB 接続情報表示(ホスト / DB 名 / ユーザー / パスワードトグル)
- •13言語 i18n:
btn_site_backup、btn_open_phpmyadmin、confirm_site_backup、backup_in_progress、backup_ready、f_password、password_notice、f_protocol
Added
customer/mypage/service-partials/_setup-monitor.php:
- •ホスティングセットアップ → VosCMS 自動インストール手順を分離
- •
system_imported 注文(vos.21ces.com 等、オーナー自身が保有するシステム登録ホスティング)は即時アクティブ処理 — モニタリングボックスは非表示
- •13言語新規 i18n:
setup_step_voscms_install
Changed
rsync exclude 追加:
- •5 つの内部プラグイン(ホスティング顧客サイトに含めてはいけないもの):
- •
vos-developer、vos-hosting、vos-license-server、vos-market、vos-salon
- •7 つの予約マイグレーション SQL(ホスティング顧客は予約システム未インストール):
- •
001_create_reservation_tables.sql、011_seed_service_translations.sql、012_seed_service_translations_p2.sql、013_add_source_to_reservations.sql、014_add_payment_status_to_reservations.sql、015_create_reservation_core.sql(新規)、016_alter_reservation_services.sql、024_reservations_bundle_columns.sql
dev files 削除追加:
- •
admin/ ディレクトリ(offline.html の残骸)— 空ディレクトリのため nginx のディレクトリインデックスで 403 が発生;sw.js が参照するのは root の /offline.html のみなので admin/ は不要
- •デフォルトエンコーディング →
obfuscate.php(旧 ionCube EVAL はランタイムハングが発生;USE_IONCUBE=1 の場合のみ ionCube を使用)
Changed
001_create_base_tables.sql が base + reservation を 1 ファイルでまとめて作成していた構造を分離:
- •修正:
001_create_base_tables.sql — コア 5 テーブルのみ(rzx_admins、rzx_users、rzx_member_grades、rzx_settings、rzx_migrations)+ コアシード(member_grades デフォルト、settings デフォルト)
- •新規:
015_create_reservation_core.sql — 予約 9 テーブル(rzx_categories、rzx_services、rzx_service_options、rzx_reservations、rzx_payments、rzx_point_transactions、rzx_business_hours、rzx_holidays、rzx_staff_positions、rzx_staff)+ 予約シード(business_hours、point_*)
ホスティング dist ビルド時に 015 を exclude → rzx_reservations テーブル未作成 → admin/dashboard.php:25-27 の $hasReservations = false → カレンダーが自動で非表示。
本社サイト(voscms.com)や RezlyX など予約システム利用先は両方の SQL ファイルが適用される → 変化なし。
Changed
config/templates/nginx-vhost.conf.tpl + HostingProvisioner addHttpsToVhost():
- •変更前: port 80(HTTPS リダイレクト)+ port 443(実コンテンツ)→ Cloudflare Tunnel + 80→443 リダイレクトで無限ループ発生
- •変更後: 80/443 統合の単一 server ブロック、同一コンテンツを提供、リダイレクトなし
- •
fastcgi_read_timeout 60s → 300s(大量 INSERT 時の nginx タイムアウト防止)
Changed
- •
provision-hosting.php(CLI バックフィルツール): ホスティング subscription metadata を自動更新(hosting_provisioned、server.{ftp,db,env})— 以前は service-order.php の _autoProvisionHosting のみ実行
- •5 つの内部プラグイン +
admin/ ディレクトリを自動削除
Added
scripts/install-cli.php 新規:
- •ホスティングプロビジョニング後の install-core.php 自動呼び出しバックフィル
- •DB 認証情報: subscription metadata 優先、なければ顧客 docroot の
.env にフォールバック
- •使用方法:
sudo -u www-data php scripts/install-cli.php --order=<ORDER>
- •成功時: addon metadata の
install_completed_at を自動記録 + order_logs の voscms_installed アクション
Fixed
- •カード決済ブランチに
_autoProvisionHosting() 呼び出しが漏れていた — 追加
- •決済 metadata の
install_info.admin_pw が平文で表示されていた → マイページ/管理者両側でトグル(👁)パターンに統一
Migration Notes
- •外部ホスティング顧客: 追加作業不要。
voscms-2.4.3.zip ビルド後、自動インストールフローがクリーンな zip を使用。
- •本社(voscms.com): 変更なし(予約 SQL 両ファイルとも適用済み)。
- •既存ホスティング顧客(dwhahn 等): deprovision + reprovision でクリーンな再インストールを推奨(分離後の新しい zip を適用)。
- •manual cleanup:
/etc/nginx/sites-available/pma.voscms.com.conf が新たに追加 — 本社システムに直接デプロイ(rsync 外)。
Added
service-order.php の決済完了直後に呼び出し:
- •新規関数
_autoProvisionHosting($pdo, $prefix, $orderId, $orderNumber) — 決済トランザクション外で実行(DB整合性を分離。失敗しても注文自体に影響なし)
- •
domain_option = 'free' のみ即時セットアップ(Cloudflare サブドメイン — DNS自動登録済みのため即座に対応可能)
- •
new(ドメイン購入後、NS変更待ち)/ existing(保有ドメインのNS変更待ち)は deferred — 管理者がドメイン有効化時点で別途トリガー
- •'install' addon に
install_info があれば voscms ファイルをデプロイ + .env 自動生成(install-core.php のstep-by-stepセッションフロー(ステップ2〜5)の自動化は voscms のインストールパイプライン全体を再設計する大規模作業のため Phase 5 で別途実施。ユーザーは決済完了後に https://<ドメイン>/install.php へアクセス → ウィザードを進行(DB情報は .env にあらかじめ注入済み))
- •ホスティングサブスクリプションの
metadata.server に ftp/db/env 情報を自動保存 → マイページのホスティングタブで自動表示(UI変更不要)
- •order_logs アクション:
hosting_provisioned / hosting_provision_skipped / hosting_provision_deferred / hosting_provision_failed
呼び出し順序: 決済コミット → _autoProvisionHosting() → _autoProvisionMailDomain()
Added
管理者サービス注文詳細ページ(detail.php:498-528)の $actionLabels を 8件 → 31件に拡張。アクティビティログでコード(mail_account_added など)がそのまま表示されていた問題を修正。
追加されたアクションマッピング:
- •メール:
mail_account_added/deleted, mail_address_changed, mail_provisioned/_skipped/_failed, mail_domain_migrated/activated, bizmail_upgrade_request
- •ホスティング:
hosting_provisioned, hosting_provision_skipped/deferred/failed, hosting_deprovisioned
- •アドオン:
admin_add_storage_addon, admin_delete_addon, storage_addon_paid/requested
- •システム:
customer_notified, setup_email_sent, server_info_updated, bulk_extended, manual_capacity_period_fix
各アクションの色の意味: green(完了/肯定)、amber(保留/警告)、red(失敗/削除)、blue(情報/通知)、violet(管理者/特殊)、zinc(中立)。
i18n キー 23個 — services.admin_orders.act_* — ko/ja/en 3言語追加(運営者ページ)。他の10言語は英語にフォールバック。
Changed
ホスティング自動プロビジョニング時の voscms 自動インストールは、ファイルデプロイ + .env 自動生成までのみ実行。install-core.php のstep-by-step セッションフロー(ステップ2〜5)の自動化は voscms のインストールパイプライン全体を再設計する大規模作業のため Phase 5 で別途実施。ユーザーは決済完了後に https://<ドメイン>/install.php へアクセス → ウィザードを進行(DB情報は .env にあらかじめ注入済み)。
installVoscms() の戻り値を変更 — install_url + note 案内メッセージ。
Added
HostingProvisioner.php — ホスティング申し込み時に自動セットアップするメインクラス。9ステップのトランザクション(失敗時は逆順でロールバック):
- •Linuxユーザー作成(
vos_<order_number>、32文字制限内、大小文字を保持)
- •ディレクトリ構造:
/var/www/customers/<order>/{public_html,logs,tmp}(chmod 750/2775/750/1770)
- •ディスククォータ(
setquota -u <user> <soft> <hard>、hard = soft × 1.1)
- •ディレクトリ競合チェック: 既存のnginx vhost /
reserved_subdomains と競合する場合は拒否
- •1.9TB SSD
/var/www マウント(ext4 + noatime + usrquota,grpquota)
- •中央sudoers(
/etc/sudoers.d/voscms-hosting-provisioner)— www-dataがuseradd/setquota/nginxなどのrootコマンドをNOPASSWDで実行
- •コマンドごとの引数パターン制限(
vos_、/var/www/customers/、*.conf)— visudo検証通過
CLIツール scripts/provision-hosting.php:
php provision-hosting.php SVC260428AE7476 hotel.com 1GB
php provision-hosting.php --order SVC260428AE7476 # DB自動参照
php provision-hosting.php --deprovision SVC260428AE7476 hotel.com
php provision-hosting.php --install-voscms <order> <domain> <capacity>
テンプレート config/templates/:
- •
nginx-vhost.conf.tpl — HTTP + ACMEチャレンジロケーション + ユーザーごとのFPMソケット
- •
welcome.html.tpl — 有効化ウェルカムページ
Added
各ホスティングが自分のユーザー権限でPHPを実行(サイト間侵害防止)+ Cloudflare proxy経由でもSSL自動発行。
config/templates/php-fpm-pool.conf.tpl:
- •
user = vos_<order> / group = www-data — UID分離
- •
listen = /var/run/php/<order>.sock — ユーザーごとのソケット
- •
pm = ondemand — トラフィックの少ないホスティングにメモリ効率
- •
php_admin_value[open_basedir] — サイトディレクトリ + /tmp + /usr/share/php のみアクセス可
- •
disable_functions — exec, passthru, shell_exec, system, proc_open, popen, pcntl_exec
- •
session.save_path / upload_tmp_dir — ユーザーディレクトリに分離
- •env: HOSTING_ORDER / HOSTING_USER / HOSTING_DOMAIN
Let's Encrypt SSL — Cloudflare DNS-01チャレンジ:
- •
python3-certbot-dns-cloudflare プラグイン
- •
/etc/letsencrypt/cloudflare/credentials.ini(root 0600、.envのCLOUDFLARE_API_TOKEN)
- •Cloudflare proxy / 外部到達性に関わらず発行
- •HTTPSサーバーブロック自動追加(TLS 1.2/1.3、強力な暗号、HSTS、X-Frame-Options、X-Content-Type-Options)
- •HTTP → HTTPS 301自動リダイレクト
- •
certbot.timer が1日2回自動更新(すでに有効)
Added
ホスティングごとに独自のDB + ユーザー分離。
- •
hosting_admin MySQLアカウント(1回作成、ALL PRIVILEGES + GRANT OPTION)— DB管理専用
- •DB名/ユーザー名 =
vos_<order>(Linuxユーザー名と同一)
- •パスワード: 32桁のhexランダム(
bin2hex(random_bytes(16)))
- •
GRANT ALL PRIVILEGES ON vos_<order>.* TO vos_<order>@localhost — 自分のDBのみアクセス
- •分離確認: 他のホスティングDB / voscms_prod へのアクセスはAccess denied 1044
VosCMS自動インストール(installVoscms() — --install-voscms または addon に install_info がある場合):
- •
voscms-dist/voscms-X.Y.Z.zip 最新パッケージを解凍 → public_html
- •
.env 自動生成: APP_KEY=base64:<32バイト> / DB情報 / HOSTING_ORDER 注入
- •権限: vos_:www-data、.env chmod 640
- •
install-core.php をヘッドレス呼び出し(現在301リダイレクト問題あり、フェーズ4と共に解決予定)
Verified
provision DEMO260429FULL demo07.21ces.com 1GB --install-voscms:
- •✅ ユーザー
vos_DEMO260429FULL(UID分離、www-dataグループ)
- •✅ ディスククォータ 1GB soft / 1.05GB hard
- •✅ PHP-FPM pool 専用ソケット
- •✅ nginx vhost(HTTP + HTTPS、HSTS)
- •✅ Let's Encrypt SSL(
/etc/letsencrypt/live/demo07.21ces.com/)
- •✅ MySQL DB
vos_DEMO260429FULL + ユーザー(分離確認済み)
- •✅ VosCMS 2.3.9 ファイル + .env デプロイ済み
deprovision: すべてのリソースをクリーンに削除(ユーザー/ホーム/DB/FPM pool/nginx/SSL)。
Added
業界標準の anniversary 方式(加入日〜1年後の同日)ではなく、カレンダー月末締め(翌月1日〜満了月末日)に変更。同じ月に加入したユーザーは満了日が同じになり、cron 一括処理・会計締めが単純化される。日本ホスティング標準(月末締め翌月1日請求)パターン。
- •DB:
rzx_subscriptions.billing_start DATETIME NULL カラムを追加(正規請求開始日)
- •ヘルパー:
_proratedFirstAmount(月単価÷30×残日数)、_calendarBillingStart(翌月1日)、_calendarExpires(末日 23:59:59)
- •申込書: ホスティング決済項目に
hosting_prorated を自動追加(例: 4/2加入 12ヶ月 ¥1,000 → 初月 ¥967 + 正規 12ヶ月 ¥12,000 = ¥12,967)
- •ドメインは anniversary 方式を維持(1年単位登録)、ホスティング・メール・メンテナンス・アドオンはカレンダー方式
- •service-order.php の
-1 second → -1 day 処理も統一
- •付加サービス(ウェブ容量追加)も同様に日割 + 正規 N ヶ月の合算。ホスティング満了日と自動同期
Added
ConoHa VPS(133.117.72.149)に Postfix + Dovecot + Rspamd + Roundcube + OpenDKIM + Let's Encrypt をセットアップ。mail-tester 10/10、FCRDNS 検証済み。申込時にドメインを自動セットアップ。
- •DNS 自動登録(
CloudflareDns.php)— A / MX / SPF / DKIM / DMARC 5種類を一括
- •DKIM 鍵生成 — mx1 SSH で
rspamadm dkim_keygen(専用 ed25519 鍵 storage/keys/mailsync_ed25519、www-data 所有、0700)
- •3モードプロビジョニング(
MailDomainProvisioner.php): free(サブドメイン即時)/ new(ドメイン購入後、管理者アクティブ化)/ existing(NS 変更案内)。existing_pending / new_pending / active モードマシン
- •パスワード: SHA512-CRYPT(
{SHA512-CRYPT}$6$...)— Dovecot 互換の一方向ハッシュ。旧 enc:(encrypt 関数)パスワードのマイグレーションスクリプト: scripts/migrate-mail-passwords.php
- •mx1 同期 cron(
scripts/mail-sync-to-mx1.php)— voscms_prod → mx1 mail_lookup virtual_users を 5 分ごとに同期。メールアクション直後にバックグラウンド同期する即時トリガー(triggerMailSyncToMx1())も追加
- •cron 自動登録:
/etc/cron.d/voscms-mail-sync
- •通知: 管理者(プロビジョニング必要)/ 顧客(メール利用可能)HTML メールテンプレート(
MailNotifier.php)
Added
基本メール / ビジネスメールをホスティングと紐付けて管理。同じアドレスが mail subscription + hosting metadata の両方に保存され、UI に重複表示されていた問題を修正(単一情報源: mail subscription)。
- •ウェブメールボタン — Roundcube
?_user=アドレス GET パラメータでユーザー名をプリフィル、target="_blank"。URL 優先度: metadata.mail_server.webmail_url → WEBMAIL_URL env → デフォルト https://mail.voscms.com/
- •メールアドレス変更ボタン — タイポ修正用。ドメインは固定、ローカルパートのみ変更。同じ注文のすべての mail + hosting metadata を同期
- •重複排除ロジック(
mail.php)— _seenAddresses で重複アドレスを1回のみ表示、mail subscription を優先
- •service-detail.php の仮想 hosting → mail 変換は、本物の mail subscription がない場合のみ動作(旧データ互換)
- •service-order.php は新規加入時に hosting metadata.mail_accounts を保存しない(mail subscription が単一情報源)
Added
マイページ付加サービスタブでホスティング容量追加決済。PAY.JP customer 登録 + chargeCustomer。
- •モーダル: 容量選択(1GB/3GB/5GB)+ カード情報入力(payjp.js v2 Elements)
- •カード登録 / 別カードで決済 / 登録カードに戻る トグル
- •期限切れ/拒否カードの自動検知(
expired_card、card_declined、invalid_* など PAY.JP エラーコード)→ カードフォーム自動表示 + ガイダンスバナー
- •カード名義入力フィールド追加(
addon-card-holder)— トークンには渡さず、customer metadata として保存(PAY.JP v2 Elements は name オプション非対応)
- •Portal パターン:
document.body.appendChild() で transform のかかったコンテナを抜け出し、ビューポート全体を覆う(z-[9999])
- •新規 customer 作成後に charge が失敗した場合、自動返金 + customer 削除(孤立防止)
- •hosting metadata.extra_storage[] に累積、hosting タブの容量ゲージで合算表示
Added
StarServer など日本ホスティング事業者の標準約款を参考に、14条項(定義・申込・料金・自動更新・解約・サービス・バックアップ・禁止事項・停止・保守・個人情報・免責・変更・管轄)を構成。カレンダー請求方式 + 初月日割 + 解約時未使用月返金ポリシーを明記。
- •システムページ登録:
config/system-pages.php hosting-terms slug、🖥️ インディゴ
- •ページエディタマッピング:
pages-document.php — pageMetaMap['hosting-terms']
- •DB シード: ja(メイン)/ ko / en の 3 言語(rzx_page_contents)
- •i18n:
site.pages.hosting_terms + hosting_terms_edit(editor_title/desc)
Added
- •4タブ常時表示(detail.php)— hosting/domain/mail/addon。データがない場合は空状態メッセージ(empty_*)を表示
- •付加サービスタブ —
+ 容量追加 ボタン(管理者無料付与モーダル、容量選択時に即時 active addon subscription 作成、billing_amount=0、expires=ホスティング満了日)+ 項目別ゴミ箱削除ボタン(ソフト削除 status=cancelled、hosting metadata.extra_storage[] から削除)
- •一覧 — 申請者表示改善(index.php)—
supervisor/admin role のシステム管理者注文は user.name + 紫色サブタイトル スーパー管理者: [email protected] 形式で表示(旧暗号化形式 applicant_name の FKzGx9SE7xG/2 復号失敗を回避)
- •申込書作成ボタン(
+ New Order)— UI のみ、機能は後日実装
- •i18n 13言語:
role_supervisor、role_admin、btn_create_order、empty_、btn_add_storage_addon、btn_delete_addon、modal_add_storage_、confirm_、alert_ など 20 以上のキー
Added
- •
subdomain-check.php — DB(reserved_subdomains)優先 + Cloudflare API フォールバック。JS checkSubdomain() がサーバー呼び出し後に結果を反映
- •service-order.php の決済直前サーバー側再検証 — クライアント側の回避を防止
- •
reserved_subdomains 自動インポート — Cloudflare zone の既存レコード 11 件(vos/bestatech/bt/dev/ec430/ec431/salon/ssh/test/thevos/ai.21ces.com)
- •メニュー INSERT IGNORE バグ修正(menus-api.php):
- •
add_menu_item: INSERT 直後に古い翻訳をクリア + INSERT ... ON DUPLICATE KEY UPDATE で上書き
- •
update_menu_item: title/url 変更を検知したら旧翻訳 13 件すべてを削除 + システムページであれば再登録
- •
rename_menu_item: title 変更時に旧翻訳をクリア
- •旧メニュー(id=38、「VosCMS 紹介」)の多言語翻訳が新しいホスティング利用規約メニューを指していたリグレッションを修正
Added
サービス申込 → 決済完了 → メールドメイン自動プロビジョニング → 顧客通知のフローを構築。
- •service-order.php に
_autoProvisionMailDomain() 呼び出しを追加 — 決済トランザクション外で実行(DB 整合性を分離)
- •DB:
rzx_reserved_subdomains(zone、subdomain、record_type、reserved_by、reason)— 可用性キャッシュ
- •DKIM 鍵を自動生成し、metadata.mail_provision に mode/origin/domain/zone/subdomain/provisioned_at を保存
- •プロビジョニングモード別 UI 分岐(service-detail.php):
pending / new_pending / existing_pending — タブを非表示にしてモニタリングのみ表示(_setup-monitor.php)、active の場合のみタブを表示
Fixed
PHP の $arr['key'] ?? [] は一時値を返すため、&$ref が元の配列に影響しない。change_mail_password / change_mail_address は success レスポンスを返していたが、metadata UPDATE が無効となり、パスワードとアドレスの変更がサイレントに失敗していた。
- •インデックスベースの直接更新パターンに変更:
foreach ($arr as $i => $item) { $arr[$i]['k'] = ... }
- •service-order.php の新規メールパスワード保存も
encrypt()(双方向)→ mail_password_hash()(SHA512-CRYPT)に変更
Fixed
- •決済サマリーの蛍光グリーン → 鮮明な色:
text-green-400 → text-green-600 dark:text-green-400(7 箇所)
- •サブドメイン可用性レスポンスメッセージの i18n キー欠如(
order.php の PHP→JS i18n マッピング + :fqdn プレースホルダーの統一)
- •満了日計算の正確化:
+N months -1 second(同日)→ +N months -1 day(正確に1日前)→ カレンダー方式で最終統一
Database
- •
rzx_subscriptions.billing_start DATETIME NULL を追加(dev + prod)
- •
rzx_reserved_subdomains テーブル(Cloudflare zone 衝突キャッシュ)
- •
rzx_page_contents に hosting-terms(ja/ko/en)をシード
Added
ドメイン・ホスティング・オプション・申込者・決済・サマリーの6エリアと決済完了ページの全テキストを13言語に翻訳。JS側のアラート/モーダルテキストは var I18N = {...} + t(key, replace) ヘルパーパターンで PHP から注入。
- •場所: plugins/vos-hosting/lang/{13 locales}/services.php —
services.order.* 200+ キー
- •マイページ サービス詳細:
services.detail.* 70+ キー、service-detail.php
- •管理者 注文管理:
services.admin_orders.* 115+ キー、admin/service-orders/
- •DB に保存された日本語ラベル(ホスティングプラン・メンテナンス・アドオン)は
_localizeLabel($sub) クロージャで設定 ID にマッピングし db_trans() を適用 → マイページ/管理者で同一処理
Added
決済ボタンクリック時に申込内容(ドメイン/プラン/オプション/申込者/利用規約)を検証し、サマリーモーダルを表示 → ユーザーが確認 → 決済進行。空のサブドメイン登録などのミスを防止。
- •order.js —
showOrderConfirmModal(), closeOrderConfirmModal(), confirmAndPay()
- •決済完了後の残存モーダルレイヤーの削除を強化(DOM 削除 + body/documentElement overflow リセット)
Added
オプションタブで「インストールサポート」(_id='install')をチェックすると、管理者 ID/メール/パスワード/サイト名の入力フォームが表示される。パスワードはマスキング + 目アイコントグル + 「インストール後に変更」案内。入力値はサブスクリプションメタデータの install_info に保存され、マイページ/管理者の両方で表示。
- •入力: _addons.php
- •表示: マイページ/管理者 partials/addon.php(青背景ボックス + パスワードトグル)
Added
オプションタブに紐づいていたメモを注文(rzx_orders.admin_notes)単位に変更。オプションの有無に関わらず、右側のアクティビティログ上に常時 7行テキストエリアで表示。AJAX update_order_memo アクションを追加。
Added
コアメニューとプラグインメニューを視覚的に区分するために section フィールド(top/main/bottom、デフォルト main)を導入。ゾーン間に自動で区切り線が入り、表示可能なメニューがないゾーンは区切り線ごとスキップ。
管理者サイドバー:
- •top: ダッシュボード / 会員管理 / サイト管理 / 自動インストール(
vos-autoinstall)
- •main: VosCMS ライセンス(
vos-license-manager)/ ホスティング管理(vos-hosting)
- •bottom: プラグイン / 設定
- •変更: config/admin-menu.php、admin-sidebar.php
マイページサイドバー:
- •top: ダッシュボード / プロフィール / メッセージ
- •main: サービス(
vos-hosting 自動追加)— 他のプラグインが追加すると自動的に蓄積
- •bottom: 設定 / パスワード / 退会 / ログアウト
- •変更: config/mypage-menu.php、mypage-sidebar.php
プラグインメニュー登録: plugin.json の menus.admin / menus.mypage 項目の section + position でゾーンを指定。services メニューはコア mypage-menu.php → vos-hosting/plugin.json へ移行(自動登録)。
Added
ライセンス検証 API と開発者ポータル API がコアにあり、すべての voscms サイトに配布すると外部に露出する問題を解消。両 API を新しい本社専用プラグインとして分離。
- •
vos-license-server(scope: hq_only): 7つのライセンスエンドポイントを移行(check, register, verify, stats, updates, register-plugin, _init)
- •
vos-developer(scope: hq_only): 7つの開発者ポータルエンドポイントを移行(register, login, submit, my-items, earnings, update-version, _init)
- •
api/_plugin_dispatch.php — コアラッパーが rzx_plugins.is_active を確認後 dispatch、非アクティブ時は 404
- •コアの
/api/license/.php・/api/developer/.php はラッパーのみ残す(外部互換性維持)
- •
/api/notices.php に HQ_HOSTS env ホワイトリストを追加(本社 voscms.com ドメインのみ応答)
- •ビルドスクリプト(
build-voscms.sh)は api/license・api/developer・api/notices.php・vos-license-manager をすでに除外済み
Fixed
- •ホスティング契約の有効期限 +1日バグ(
+12 months → +12 months -1 second)— subscription/free/paid/bank の4箇所に適用
- •ビジネスメール 2件以上追加できないバグ(セレクターが × ボタンを掴んでいた問題)
- •注文サマリーで追加ストレージが未集計(storage select の name 属性が欠落していた)
- •ホスティングプランラベルの多言語未適用 —
service_hosting_plans._id と db_trans() のマッチングで解決
v2.3.8
2026-04-25 · 6か月前
掲示板多言語対応の完成 + FAQ/Q&Aスキン
Added
_init.phpがrzx_translationsからboard.{id}.{title|description|header_content|footer_content|seo_keywords|seo_description}を直接照会(現在のロケール → en → 原本)。list/read/write/settingsどのページでも$board[$field]が翻訳値で自動的に埋められる。掲示板設定ページの「← 戻る」ボタンも同じ仕組みで自動翻訳。
issue掲示板(id=6)のtitle + header_content 13言語シード(HTML構造を維持し、テキストのみ翻訳、処理段階バッジも各言語で表示)。シードスクリプト: scripts/seed_issue_i18n.php + scripts/seed_issue_i18n_data.php。
Added
rzx_board_extra_varsの定義(ラベル・説明・選択肢・デフォルト値)を13言語に翻訳。4フィールド × 13 = 52行。
- •
ExtraVarRenderer::renderAll($vars, $values, $mode, $boardId) — boardId引数追加、applyDefTranslations()が1クエリで全varの翻訳を一括ロード。
- •
ExtraVarRenderer::getOptionLabel($boardId, $varName, $value) — リストビュー用の単一オプション翻訳ラベル照会(静的キャッシュ)。
- •
renderStatusBadge($value, $size, $displayLabel = null) — 色は原本(ko)マッピングを維持、テキストのみ翻訳 → どの言語でも色が一貫(受付=ローズ、解決済み=エメラルド)。
- •select/radio/checkbox:
value=原本 / label=翻訳パターン。投稿保存時は常に原本値が保存されデータ互換性を保証。
- •呼び出し元の更新:
read.php, write.php, _list-row.php, defaultスキンの_list-card/_list-webzine/_list-gallery。
iissueボードのstatus拡張変数13言語シード: scripts/seed_ev_status_i18n.php。
Added
extra_var_get APIがdb_trans()で現在のロケールの翻訳値をlocalizedオブジェクトとして返す。JSモーダルはlocalized.title || ev.titleを優先表示 → 日本語モードでモーダルを開くと「処理ステージ」が自動表示。
extra_var_updateはロケールによって分岐:
- •ソースロケール(ko)→ ソース行全体を更新(既存の動作)
- •非ソースロケール(ja/en/…)→ メタ(
var_type/権限/チェックボックス3種)のみソースに保存、4つの翻訳フィールド(title/description/options/default_value)はrzx_translationsに現在のロケールで保存 → ソースの整合性を保証
拡張変数一覧の表示名もdb_trans('board_ev.{boardId}.{varName}.title')を適用。
Added
拡張変数編集モーダルの「編集権限」セクション(ラベル・ドロップダウン選択肢・ヘルプ文)を13言語のlangファイルに分離。新規キー: site.boards.ev_permission, ev_perm_all, ev_perm_member, ev_perm_admin, ev_permission_help。
Added
拡張変数編集モーダルの「選択肢」フィールドを双方向正規化:
- •モーダルロード: DBのJSON配列(
["a","b","c"])を改行形式に変換してtextareaに表示(案内文と一致)
- •保存API:
ev_normalize_options()ヘルパーが改行またはJSON入力を受け取り、一貫してJSON配列として保存。従来は改行入力がNULLとして保存されていたバグを修正。
Added
issue/お知らせ以外の新しいコンテンツパターン向けに2つのスキンを新設。
FAQ (skins/board/faq/) — 投稿=質問、本文=回答。検索バー・カテゴリフィルター・ページネーション付き。タイトル領域表示トグル、タイトル/サブタイトル多言語、背景(画像・動画・なし)サポート、オーバーレイ透明度調整。v1.0.1。
Q&A (skins/board/qna/) — 投稿=質問(タイトル+本文)、コメント=回答。未回答バッジ、最初の項目自動展開、ツリー並べ替え(parent_id/depth)コメント表示。返信への返信はインデント+「↳ 返信」ラベル(最上位は「A.」)。インライン編集/返信フォーム(作成者/管理者のみ編集、perm_commentの権限者のみ返信)。v1.0.0。
2スキン共通: 管理者設定歯車アイコンを検索バー下部右側に配置(タイトル領域から分離)。boardSkinFile()の_list-full.php優先で動作。
Added
api-comments.phpにupdateアクションを追加。comment.user_id == 現在のユーザーまたは管理者のみ編集可能。文字数制限検証後、content + updated_atを更新。
Added
レイアウト設定のcopyrightフィールド内の{year}トークンをレンダリング時に現在の年に自動置換。DBには原本({year}含む)が保存されるため毎年修正不要。適用: default/minimal/modern/base-footer.php。4つのlayout.jsonの著作権説明を13言語に拡張し、{year}使用案内も各自国語で表示。
default/minimalフッターで$_lc['copyright']が無視されていたバグも同時修正 — レイアウト設定値が実際にレンダリングされるようになった。
Added
menu_item.38.title 13言語シード(VosCMS紹介 / About VosCMS / VosCMSについて / Über VosCMS / Acerca de VosCMS / À propos de VosCMS / Tentang VosCMS / VosCMS-ийн тухай / О VosCMS / VosCMS Hakkında / Giới thiệu VosCMS / 关于 VosCMS / 關於 VosCMS)。
Added
処理段階ごとにサンプル1件ずつ + 既存の解決済み1件 = 合計4件。各投稿のtitle/content 13言語翻訳(104行)。
| 段階 | タイトル(ko) | ステータス |
|---|
| 受付 | 【バグ】モバイルのハンバーガーメニューのXボタンが動作しません | 新規 |
| 確認中 | 【機能リクエスト】コメント投稿時に投稿者へメール通知 | 新規 |
| 進行中 | 【パフォーマンス】マーケットプレイス詳細ページの初回読み込み速度改善 | 新規 |
| 解決済み | 掲示板に添付した画像を本文に挿入... | 既存 |
既存のpost 34(Tailwindインラインスタイルが蓄積したテスト投稿)を削除。
Fixed
customer/board/list.phpが167行目でrzx_admin_iconsヘルパーをrequireしていたが、161行目でスキンファイルをincludeした際にreturnで抜け出したため、FAQ/Q&AスキンでFA rzx_admin_icons()を呼び出すと500エラーが発生。require_onceをスキンincludeの前に移動。
Changed
旧 /marketplace 名称への残存参照を削除。検索フォームが /marketplace へGET送信されてダッシュボードにリダイレクトされていたバグ(検索・ソート・フィルター変更時にページ離脱が発生)を修正。browse.php、item-detail.php、item-submit.php、purchases.php、assets/js/marketplace.js のすべてを /autoinstall に統一。
Added
install.php Step 4 で管理者パス入力欄の下に黄色のヒント + URLリアルタイムプレビュー + 折りたたみ式「なぜ変更すべきか?」ガイドを追加。自動ハッキング試行(ブルートフォース)、脆弱性スキャン、強力なパスワードの限界など、誰でも理解できる言葉で3つの理由を提示。13言語すべてに適用。
Added
install.php の設置完了ステップで vos-autoinstall プラグインを自動登録・有効化(PluginManager::install() を直接呼び出し)。ユーザーが別途インストールなしに管理画面に入ってすぐにマーケットプレイスを利用可能。
Added
market.21ces.com/api/market/catalog および /item に ?locale=xx パラメータを追加。name、description、short_description、cat_name の多言語JSONをサーバー側で単一の文字列として返す(フォールバック: リクエストロケール → en → 最初の値)。VosCMS側の json_decode + locale フォールバック 重複ロジックをすべて削除(browse.php、item-detail.php、_components/item-card.php)。
Added
ファイルベースのマーケットプレイスAPIレスポンスキャッシュのTTLをPluginManager設定に統合管理。ハードコード30分 → デフォルト5分、1・5・10・30・60分オプション。https://vos.21ces.com/theadmin/settings/general のマーケットプレイスキャッシュセクションと /theadmin/autoinstall/settings の両方が同じ設定を読み書きし自動同期。AutoInstallページ右上・一般設定ページの両方に即時キャッシュ更新ボタンを追加。TTL変更時に既存キャッシュを自動無効化。
Added
マーケットプレイス管理と同じデータ種別 / 簡単な説明 / スラッグ / Product Key / 最小VosCMS・PHPバージョン / パートナー / 価格 / ライセンスのテーブルをヘッダー直後に表示。左:右コンテンツ比率を2:1 → 3:1に変更してコンテンツ領域を拡大。
Added
詳細ページのレビュータブ右上に「レビューを書く」ボタン。星評価・ニックネーム・本文入力モーダル → VosCMS API → マーケットプレイス POST /api/market/item/review に中継。VosCMSライセンスキー + ドメイン自動添付、同一ドメイン1回投稿制限、購入者は is_verified=1 自動設定。レビューはマーケットDB(rzx_mkt_reviews)に status='pending' で保存後、運営者承認後に公開。GET /api/market/item/reviews?slug=... を新設し承認済みレビューのみ取得。ドメインは部分マスク(mys***.com)表示。
Added
以前の「無料のみ」チェックボックス → 「すべて / 無料 / 有料」3ウェイトグルに拡張。マーケットcatalog APIに paid=1 パラメータを追加(i.price>0)。検索欄から分離してビュートグル領域の前に移動し、ソートselectと共にヘッダーツールバーに統合。
Changed
検索inputのボーダー border-2 border-emerald-300、左側検索アイコンに緑の背景ボックス、検索ボタン bg-emerald-500。キーワード入力のみ残してソート・フィルター機能は本文ヘッダーに移動し、検索欄をシンプル化。
Changed
| 状態 | 表示 |
|---|
| 無料 | インストール + ダウンロード |
| 有料(未購入) | 購入(マーケットプレイス PAY.JP 決済モーダル) |
| 有料(購入済み) | インストール + ダウンロード |
| インストール済み | 「インストール済み」 |
リストページ4ビュー(リスト/ウェブジン/カード/グリッド)も同じ分岐。購入済みスラッグセットをページ入場時に1回取得して再利用。決済はマーケット POST /api/market/item/purchase でPAY.JP決済 + ライセンス発行。
Changed
- •ビュースタイルトグル: テキストラベル削除 → アイコンのみ +
title / aria-label(アクセシビリティ維持)
- •タイプバッジ:
bg-<color>-100 明るい背景 → bg-zinc-900/85 backdrop-blur-sm 黒半透明 + カラーテキスト(画像上の可読性確保)
- •スクリーンショットセクション: ヘッダー直後 → タブコンテンツ下に移動、マーケットと同様に
(件数) カウント表示
- •詳細ページの
dark:prose-invert が機能しない問題 → CDN TailwindにTypographyプラグインを追加
- •詳細ページの説明エリア: マーケット管理と同じ方法で
<script>/<iframe>/<style>/onXX 等の危険要素のみ除去し、HTMLマークアップはそのままレンダリング
Fixed
- •PAY.JPカードフォーム入力不可: hidden状態で事前にmountされiframeが0pxで描画されていた問題。lazy初期化 +
requestAnimationFrame mountで解決
- •ウィジェットサムネイル欠落: マーケットDBには28個のウィジェットが登録されているが
/var/www/market/widgets/ には無料ウィジェット12個のみコピーされた状態。14個の欠落分を同期。catalog/item APIに screenshots の絶対URL変換 + 存在しないファイルの自動フィルターを追加
- •バンドルプラグイン未認証警告:
vos-autoinstall が unauthorizedPlugins として検出されていた問題。LicenseStatus.php に BUNDLE_PLUGINS = ['vos-autoinstall', 'vos-marketplace'] 定数を追加し、active()/fromCache()/canUsePlugin() すべてでフィルタリング。ライセンスサーバーの verify.php にも同様の処理
- •ウィジェット重複追加の可能性:
install.php のシードが INSERT IGNORE のみ使用していたが、rzx_page_widgets にUNIQUE制約がないため重複が起こりうる状態。シード時に DELETE FROM page_widgets WHERE page_slug='home' 後にINSERTに変更(DB UNIQUE制約は掲示板ウィジェット等の意図的な重複ケースがあるため追加しない)
Migration Notes
- •
vos-autoinstall プラグインのメニュー/ルート/マイグレーションが新規インストールで自動有効化される(既存インストールは管理画面で一度有効化が必要)
- •マーケットプレイスAPIキャッシュのデフォルトTTL 30分 → 5分(価格・内容変更の迅速な反映)
- •
vos-autoinstall.cache_ttl プラグイン設定が新規追加
v2.3.6
2026-04-21 · 6か月前
マーケットプレイス API ライブ連携
Changed
- •
browse.php: ローカル DB クエリ → market.21ces.com/api/market/catalog へのライブ API 呼び出しに変更
- •
item-detail.php: ローカル DB → /api/market/item・/api/market/item/versions API 呼び出しに変更
- •
CatalogClient.php: API ベース URL を /api/v1 → /api/market に変更、レスポンスフィールド items[] → data[] に合わせた
Fixed
問題: market.21ces.com/index.php のレイアウト適用ブロックで $__noLayout = true のケース処理が漏れており、プラグイン API ルート(api/market/*)全体が HTTP 200 + 空レスポンスを返していた。
修正: index.php の末尾に elseif ($__pageFile && $__noLayout) { include $__pageFile; } を追加。api/market/catalog・api/market/item・api/market/updates/check などが正常化された。
Added
plugins/vos-market/views/api/catalog.php に sort・free・featured パラメーターを追加し、レスポンスフィールドを拡張(sale_price、rating_avg、is_featured など)。
Added
mpApiFetch() ヘルパー: 30分 TTL のファイルキャッシュでマーケットサーバーへのリクエストを最小化。API レスポンス失敗時はエラーバナーを表示。
v2.3.5
2026-04-21 · 6か月前
ライセンス自動登録ロジックの完成
Fixed
問題: AdminRouterで$licenseClient = new LicenseClient()インスタンスを生成して自動登録を試みた後、$_ENV['LICENSE_KEY']の更新がインスタンス内部の$this->licenseKeyに反映されず、同一リクエスト内でcheck()を呼び出すと依然としてunregisteredを返すバグ。
Changed
- •
check()に入った時、$this->licenseKeyが空なら即座に/api/license/registerを呼び出す
- •成功時:
$this->licenseKey更新 + $_ENV['LICENSE_KEY']更新 + .envファイル保存後、verifyステップへ進む
- •失敗時(サーバー無応答)のみ
unregisteredを返す
- •新規
saveKeyToEnv()メソッド: 空のLICENSE_KEY=行(install.php失敗ケース)を実際のキーに置換、すでに有効なキーがある場合はスキップ
効果
- •install.phpなしで手動インストールしたユーザー → 管理者初回アクセス時に自動ライセンス登録
- •旧バージョンからアップデートしたユーザー(LICENSE_KEYなし)→ アップデート後の管理者初回アクセス時に自動登録
- •ダッシュボードの「ライセンスが登録されていません」メッセージはライセンスサーバー自体が応答不能な場合のみ表示
Fixed
database/seeds/legal_pages.php シードファイルに、Tailwind CSS 変数(--tw-scale-x・--tw-pan-x 等、400 以上)が各 <h1>/<h2>/<p> タグの style="" 属性にインラインで埋め込まれていた問題。インストールのたびにこの汚染が DB に伝播し、terms および privacy ページが肥大化(特に privacy/ko は 128KB、正常は 2KB)。
- •
database/seeds/legal_pages.php: 442KB → 131KB(70% 削減、構文有効)
- •開発 DB の既に汚染されていた 26 行を浄化: 1.04MB → 56KB(988KB 削除、−95%)
- •
scripts/clean-inline-styles.php を新規追加 — style="... --tw-* ..." 一括クリーンアップツール(再発時に再利用可能)
Changed
.board-content CSS に「h2 をカードヘッダーとして、h2+p をカードボディとして強制変換する」ルールが含まれており、Tailwind で直接デザインされたページ(例: Brand)のヒーロー構造が崩れていた。
- •カード型ブロックの 103 行を削除(149 → 45 行)
- •残存ルール: 基本タイポグラフィ(p/h·/blockquote/code/ul/ol/table)、OG リンクカード、ダークモードテキストオーバーライド
- •結果:
Brand の元のデザインを復元(左青線 h2、中央揃えヒーロー等)
- •法的文書(terms/privacy 等)は標準の
<h1><h2><p> タイポグラフィで十分 — カード型は過剰な装飾だった
Changed
背景: 2.3.1 でページコンテンツを日本語原文の rzx_page_contents と非日本語の rzx_translations に分離し、2.3.2 でエディタ保存パスを追加したが、設計再検討の結果、2テーブルの実質的な構造が同一(slug/key + locale + content)でありながら以下のコストを生じさせることが判明した:
- •日本語原文が両テーブルに重複保存(db_trans フォールバックチェーンのミラーリング用)
- •エディタ保存ロジックで ko vs. 非 ko の分岐が必要
- •ページ管理 UI でのロケール状態表示時に 2 テーブルの JOIN が必要
- •もともとの根拠(「AI 翻訳パイプライン統合キュー」)もページ本文(10KB HTML)と UI 文字列(20 バイト)では異なるワークフロー(チャンク分割・タグ保持など)が必要で統合価値が小さい
復元構造: rzx_page_contents 単一テーブル、ロケールごとに 1 行(元の設計)
Migration
- •
rzx_translations.page.{slug}.title/content × 7 slug × 12 非 ko ロケール(168 行)→ rzx_page_contents に復元
- •
rzx_translations から page.* キーを全削除(234 行)
- •対象: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy
- •開発・本番 DB 両方に適用
Changed
- •
resources/views/admin/site/pages-edit-content.php — ko/非 ko 分岐を削除、シンプルな UPSERT に統一
- •
resources/views/admin/site/pages-document.php — 同上
- •
resources/views/customer/page.php — db_trans('page.*.title/content') を削除、page_contents を直接参照(フォールバックチェーン locale → en → ko は維持)
- •
resources/views/admin/site/pages.php — ページ一覧のタイトルも page_contents.title を直接参照
Kept
rzx_translations 自体は維持 — 以下の用途で引き続き使用:
- •掲示板(
board_post.{id}.title/content)
- •UI 文字列(
menu.*、設定ラベル)
- •ページ SEO メタ(
page.{slug}.browser_title|meta_keywords|meta_description)— 短い文字列なのでここが適切
原則: 短い UI/メタ文字列 → rzx_translations、長いページ本文 → rzx_page_contents、データの特性に合わせてストレージを分離。
v2.3.2
2026-04-20 · 6か月前
ページエディタ翻訳DB保存ロジックの整合
Changed
2.3.1でページコンテンツの保存構造を原本ko(rzx_page_contents)+ 翻訳DB(rzx_translations)へ移行した後も、管理者エディタがすべてのロケールをrzx_page_contentsのみにINSERT/UPDATEしており、移行形式と食い違いが生じ、レンダリング側のdb_trans()での照会が失敗する問題を修正。
分岐ルール(原本ロケール = $_ENV['DEFAULT_LOCALE'] ?? 'ko'):
| locale | 保存先 |
|---|
ko(原本) | rzx_page_contents + rzx_translationsにミラーリング(db_trans()フォールバック用) |
en/ja/zh_CN/... | rzx_translationsのみ(page.{slug}.title、page.{slug}.content) |
非原本ロケール保存時にrzx_page_contentsに原本行がない場合、スタブ行を自動生成(メニュー・設定の接続を保持)。is_activeは原本行に統一適用。
Changed
非原本ロケールの編集画面を開く際:
1. rzx_translationsからpage.{slug}.title/content + localeを先に照会
2. 見つからない場合はレガシーrzx_page_contents行にフォールバック(移行漏れページの互換性確保)
原本ロケールは従来通りrzx_page_contentsのみ。
Changed
- •ページ削除:
rzx_translations WHERE lang_key LIKE 'page.{slug}.%'も同時削除
- •スラッグ変更:
rzx_translations.lang_keyのpage.{old_slug}. → page.{new_slug}.を一括UPDATE
Changed
rzx_page_contents にロケールごとのフルコンテンツ行を格納していた方式を、原文 ko + 翻訳DB(rzx_translations) 方式に統一。掲示板(board_post.*)の保存構造と整合性を確保。
対象7ページ: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy
Before:
rzx_page_contents
├── Brand / ko (フルコンテンツ)
├── Brand / en (フルコンテンツ)
├── ... (13 locale 行)
After:
rzx_page_contents
└── Brand / ko (原文 1行)
rzx_translations
├── page.Brand.title × 13 locale (ko 含む)
└── page.Brand.content × 13 locale
マイグレーション結果:
- •
rzx_page_contents: 7スラッグ × 12非ko行 = 84行削除
- •
rzx_translations: 7スラッグ × 13ロケール × (title + content) = 182行移行
- •開発・本番DB両方に適用、レンダリング検証通過(ko/en等ロケール別に正常表示)
Changed
- •「新しいページ」ヘッダーボタンを削除 — 機能しないプレースホルダーでした。ページはメニュー管理で作成されるのが唯一の正しい方法。
- •ゴミ箱 🗑 アイコン + AJAXハンドラー +
deleteUserPage() JS を削除 — メニュー削除時にページも一緒にクリーンアップされるため、ページ単独の削除パスは不要。誤削除によるメニュー破損を防止。
- •維持: 設定 ⚙ · 編集 ✏ · プレビュー 👁 アイコン
Fixed
- •
設定 > サイト > ロゴ画像 アップロード失敗: storage/logos/ サブディレクトリが存在せず move_uploaded_file() がサイレントに失敗。アップロードハンドラーにサブディレクトリ自動作成を追加 + 開発・本番サーバーにディレクトリ作成(www-data:www-data, 775)。
- •レイアウトロゴ優先度の復元: 一時的に「サイト設定優先」に逆転させたが、「レイアウトデザイン固有ロゴ」要件に合わせて レイアウト > サイトフォールバック に復元。レイアウトにロゴが指定されていない場合はサイトロゴを自動使用。
- •対象:
skins/layouts/{default, minimal, modern, modern-copy-260413}/header.php および footer.php
Fixed
- •
bi-guide / logo-guide スラッグの重複2行のうち最初に作成されたものだけを保持(id=186, 187)、重複 id=193, 194 を削除
- •開発・本番両方に適用。メニューAPIの重複INSERTバグはv2.3.0で修正済み
Added
/var/www/_upload/ にロゴ資産を作成 — 必要に応じて本番環境にアップロード:
アイコン(マークのみ)
- •
voscms-logo-color-{256,512,1024}.png · カラー(deep·ocean·sky·ocean + 中央deep)
- •
voscms-logo-mono-{256,512,1024}.png · sky単色 + opacity 1/0.7/0.48/0.7 グラデーション
横型ワードマーク(ヘッダー用)— 820×256 比率
- •
voscms-wordmark-{128h,256h,512h}.png · ライト(Vos deep + CMS グレー)
- •
voscms-wordmark-dark-{128h,256h,512h}.png · ダーク(Vos sky + CMS slate-300)
縦型ワードマーク(アプリアイコン・OG画像用)— 360×420 比率
- •
voscms-stacked-light-{256h,512h,1024h}.png
- •
voscms-stacked-dark-{256h,512h,1024h}.png
SVGオリジナルはすべて保存。librsvg2-bin インストールで rsvg-convert CLI が利用可能。OKLCH色未サポートの問題はhex変換版(voscms-logo-mono-hex.svg)で解決。
Added
- •DB テーブル
rzx_changelog 新規 — バージョン × locale 別の独立レコード、translation_source(original/ai/manual)+ source_hash 追跡
- •パーサー
RzxLib\Core\Changelog\ChangelogParser — Keep a Changelog 標準 + 内部セクションホワイトリスト(Infrastructure/Internal/Refactor/Chore/Docs/Test は非公開)
- •インポーター
ChangelogImporter — べき等マージ、手動翻訳の保護、content_hash による変更検知
- •CLI スクリプト
scripts/import-changelog.php — --file --locale --dry-run --silent オプション、SemVer プレリリース(2.1.1-hotfix)対応
- •翻訳インターフェース
RzxLib\Core\Translate\{TranslatorInterface, NullTranslator, TranslatorFactory} — Gemma 4(ai.21ces.com)GPU 準備完了後、config/translator.php の driver 変更のみで有効化
- •システムページ
/changelog 登録(config/system-pages.php)、フロントビュー resources/views/system/changelog/index.php
- •専用スキン
skins/page/changelog/skin.json — カードスタイル(filled/outlined/flat)、セクション別カラー、バージョンバッジ、日付フォーマット、相対時間表示、内部セクション表示トグル
- •編集ページ
/changelog/edit 分離 — MD アップロードプレビュー、多言語カバレッジマトリクス、バージョン別トグル・削除、AI 翻訳ボタン(準備中)
- •デプロイ自動化
deploy-voscms.sh に 1.5/5 Changelog import ステップ追加 — ko + 12 locale .md ファイルの自動検知・マージ
- •翻訳キー
site.pages.changelog を 13 locale に追加
Changed
- •タブ順の整理:
[基本情報] [権限] [詳細設定] [スキン] — システムページは末尾に独自タブを追加可能
- •
settings_tabs スキーマ導入(config/system-pages.php)— システムページがトップレベルのタブ配列を宣言、各項目は key/label/icon/view で動的レンダリング。既存の settings_view 下部 include レガシーを削除
- •原則の確立: 設定 = 見た目 + 機能 / 編集 = データ — アップロード・バージョン・翻訳などのデータ管理 UI は
/changelog/edit に分離
- •MERGE 保存戦略 —
save_settings ハンドラが既存設定とマージ。タブが分割されていても他タブのデータが消去されない
- •
saveSettings() JS — DOM に存在するフィールドのみ送信。タブ分離環境で一部フィールドが未レンダリングの場合も安全
- •レイアウト・スキンカードの位置 — 基本情報タブに戻す(ユーザーフィードバック反映)。スキンタブは skin.json 変数のみ専任
- •ページ幅の重複を削除 — 基本情報タブの
page_width フィールドを削除(スキンの content_width に統合)
- •service/order 内部サブタブの平坦化 —
config/service-settings-tabs.php の general/domain/hosting/addons を settings_tabs に移行、トップレベルタブに昇格
Changed
- •
/{slug}/settings・/{slug}/edit が config/system-pages.php も認識するように — 従来は rzx_page_contents DB のみ参照しており、システムページが 404 になっていた。DB → config の順で参照するよう変更
- •
edit_view フィールド新設 — システムページ専用の編集ビューファイルパスを直接指定。/{slug}/edit クリック時に当該ビューを直接 include(管理者リダイレクトホップを削除)
- •pages-settings.php フォールバック — DB レコードのないシステムページも config から
$pageData を構成し、「ページ管理一覧」へのリダイレクトを防止
- •管理者アイコン URL 統一 —
/{slug}/settings・/{slug}/edit でフロント標準 URL を使用
Fixed
- •
menus-api.php: external ページタイプの INSERT 前の重複チェック漏れを修正 — メニュー保存を2回クリックした際に rzx_page_contents に重複行が発生する問題
- •メニュー削除時の external タイプ + widget の page_contents クリーンアップ漏れを修正 — 孤立レコードを防止
Fixed
- •タイトル背景(
title_bg_type, title_bg_image, title_bg_video, title_bg_overlay, title_text_color)、show_title, show_breadcrumb, custom_css, custom_header_html, custom_footer_html — すべての標準ページスキン変数が公開ビューに反映されるよう修正
- •
_page-title-bg.php partial が $_contentWidth 変数を受け入れるように — タイトル領域がコンテンツ幅に追従
- •管理者アイコンをタイトルから分離 — コンテンツ上部右側に独立配置。
show_title=0 でも常に表示
- •タイトル領域上部に 20px の余白を追加(背景レイアウトのバランス調整)
Added
- •
site.pages.contact 翻訳キーを 13 locale に追加(ko/en/ja/zh_CN/zh_TW/de/es/fr/id/mn/ru/tr/vi)— 既存の漏れを解消
- •ページ管理システムガイド
docs/PAGE_ADMIN_GUIDE.md 新規 — タブ構造・スキーマ・ルーティング・権限・拡張方法をまとめたドキュメント
Added
- •アイテムごとの 数値・接尾辞・ラベル(多言語)・アイコン・カラー フィールド
- •管理者ウィジェットビルダーでアイテムの 追加/編集/削除 が可能(
stat_items タイプ編集UI を新設)
- •16種のアイコン(users, chart, star, heart, check-circle, clock, calendar, globe, shield, lightning, trophy, cart, dollar, building, chat)+ 10種のカラー
- •ビューポート進入時の カウントアップアニメーション — IntersectionObserver + easeOutCubic 1.4s
- •数値のみカウント対象(
24/7 等の文字列はそのまま表示)、コンマ書式・小数点を維持
- •
widget.json v1.1.0 → v1.2.0
Fixed
- •
admin_name が enc: プレフィックス付きで保存され、復号されずそのまま表示されていた問題を修正
- •アバター取得が存在しない
staff テーブルを LEFT JOIN していた問題 — admin_id = users.id 統合構造に合わせ rzx_users.profile_image を直接参照するよう修正
- •相対パスのアバターに baseUrl プレフィックスを自動付与
Added
- •全掲示板の
<input type="url"> フィールド(拡張変数 url タイプ含む)の横に [サムネイルを取得] [スクリーンショットを取得] ボタンを自動挿入
- •サムネイル: 1280×960 ネイティブレンダー → 800×600 出力(ファーストビュー)
- •スクリーンショット: 1280×フルページ ネイティブレンダー → 800×縮小 出力(全スクロールページ、実際のページ高さ使用)
- •ステップ別プログレスバー UI —
サーバー接続 → ページ読み込み → 画面キャプチャ → 画像生成 → ファイル保存 → レスポンス待機
- •キャプチャサムネイルの自動代表設定 —
board_files.is_primary=1 としてマークされ、board-showcase ウィジェットが優先使用
- •新規ルート
/board/api/url-capture?type={thumbnail|screenshot}&url=... + api-url-capture.php プロキシ
- •
/board/api/files に set_primary アクションを追加 — 既存の添付ファイルから代表を指定
Changed
- •添付画像クエリを
ORDER BY is_primary DESC, id ASC に変更 — キャプチャサムネイルを優先表示
- •投稿作成時に
primary_file_pos パラメータでサーバーへ代表ファイルのインデックスを送信
v2.2.0
2026-04-18 · 6か月前
マーケットプレイス分離
Changed
- •マーケットプレイス製品の分離:
plugins/vos-marketplace/ プラグインが共有していた機能を独立製品として分離 → github.com/THEVOSjp/Marketplace 新規リポジトリ、market.21ces.com に独立デプロイ
- •プラグインは「顧客向け UI(探索・購入・インストール・ライセンス)」のみ保持。データ・販売者・精算はマーケットプレイスサーバーが専任
- •Core 側の API 連携ポイントを更新
Added
- •言語選択後にモーダルを表示 —
.env + DB + storage/uploads/ のバックアップ必要性 + APP_KEY 紛失時の復号不可警告
- •チェックボックス + 確認ボタンの 2 段階確認(無条件インストール禁止)
- •13 言語すべての翻訳を追加(
backup_title/body/item_env/db/uploads/warn/check/confirm/cancel)
Added
- •
scripts/register-widgets-to-marketplace.php — ファイルベースのウィジェット 28 件を rzx_mp_items に一括登録
Changed
- •
plugins/vos-marketplace/src/CatalogClient.php — デフォルト API URL を https://market.21ces.com/api/v1 に変更、fetchItem() パス更新、checkUpdates() クエリ形式更新
- •
plugins/vos-marketplace/plugin.json — marketplace_api_url デフォルト値を更新
- •
rzxlib/Core/Modules/WidgetLoader.php — サムネイル URL に ?v={mtime} キャッシュバスターを追加(Cloudflare immutable キャッシュ対応)
Fixed
- •
widgets/feature-tour/widget.json — フィールド整理
- •一部ウィジェットのサムネイルを更新(staff、testimonials、feature-tour、shop-map、shop-ranking、stylebook)
Added
- •contact-info (v0.1.0) — 連絡先カード(住所/電話/メール/営業時間 + 画像 + 小地図)
- •location-map (v0.1.0) — 横型地図(Google Maps + 下部3列情報、幅調整可能)
Added
- •アイテム提出ページの全面リファクタリング — 3タブ(基本情報/リリース/販売)
- •ライセンス(GPL/LGPL/BSD/MIT/CC/PD/商用)、リポジトリURL、デモURL、依存プラグイン、バナー画像
- •リリース履歴、販売情報(公開/有料トグル、割引価格/終了日)、UX改善
Added
- •デベロッパーメニュー(ID:20)を13言語対応、Hero CTA のdescription/typing_wordsを12言語補強
Changed
- •ウィジェット名の区別を明確化(地図/連絡先カード)、
page.php fullWidthTypes追加
- •contact-form カテゴリ → ラベルのみ(コード削除、ウィジェット設定編集可能)
Fixed
- •board-contents/board-showcase: file_type → mime_type
- •boards-api: is_shown_in_list 欠落 + options JSON 制約
- •contact-form POST: ob バッファ全クリア
- •Hero CTA: typing_words/description の
\n 二重エスケープ
DB Changes
- •rzx_mp_items: license, repo_url, demo_url 追加
- •rzx_board_extra_vars: is_shown_in_list 追加
- •rzx_contact_messages: 新規テーブル
Added
- •download-hero ウィジェット — ソフトウェアダウンロードページ(version.json リアルタイム連携、4言語内蔵、主な機能/システム要件/バージョン履歴)
- •/downloads ページ — widget タイプのシステムページ、13言語メニュー翻訳、
is_system=1
- •contact-form ウィジェット(v0.1.0)— 非公開 1:1 お問い合わせフォームウィジェット(ゲスト対応、カテゴリ選択、ハニーポットスパム防止、AJAX 送信)
- •contact-info ウィジェット — 連絡先情報表示ウィジェット
- •location-map ウィジェット — ロケーションマップウィジェット
- •rzx_send_mail() 共通ヘルパー —
rzxlib/Core/Helpers/mail.php に SMTP メール送信関数を新設
- •rzx_contact_messages テーブル — お問い合わせ保存用 DB テーブル
- •/contact ページ — widget タイプのシステムページ、13言語メニュー翻訳
Fixed
- •システムページ削除保護 — メニューからシステムページを削除した際、ページコンテンツ/ウィジェットを保持(メニュー項目のみ削除)
- •
menus-api.php: DB の is_system + config/system-pages.php slug の二重チェック
- •
menus-js.php: システムページ削除時に「メニューからのみ削除されます」の案内メッセージを表示
- •システムページメニューの多言語対応 — システムページをメニューに追加する際、
site.pages.* 翻訳キーから13言語のラベルを自動登録
- •ダウンロードページの翻訳 —
site.pages.downloads の13言語翻訳を追加
Changed
- •ホームページヒーロー — Download ボタン →
/download/voscms-latest.zip 直接ダウンロード、バージョンを v2.1.1 に更新
- •Auth.php —
sendSmtpMail の前に rzx_send_mail() 共通ヘルパーを優先呼び出し(フォールバック維持)
- •index.php —
mail.php ヘルパーの自動ロードを追加
Changed
- •ホスティングタブ — サマリーカード + 使用量プログレスバー + FTP/DB接続情報テーブル(管理者設定時に自動表示)
- •ドメインタブ — ドメインカード + メイン設定 + ネームサーバー情報テーブル(管理者設定時に自動表示)
- •メールタブ — メールサーバー情報(IMAP/SMTP)+ アカウント別カード + インラインパスワード変更
- •メンテナンスタブ — 情報カード + 点検予定日 + 作業履歴(管理者記録時に自動表示)
- •付加サービスタブ — カードレイアウト統一
- •管理者パーシャルと同一の情報構造に統一(管理者が metadata に入力 → マイページに自動反映)
Changed
- •アクティビティログ領域を 1/3 → 1/5 の比率に縮小
- •管理者ドメインタブの NS デフォルト値ハードコーディングを削除(Cloudflare API 連携に備え)
Changed
- •プロビジョニングワークフローを全面刷新: サブドメイン優先 → 購入ドメインを後続連結
- •プロビジョニング ID 規則: サブドメイン名または購入ドメインの SLD
- •Cloudflare ワイルドカードトンネルを活用(サブドメイン A レコード追加不要)
- •サーバー 2 のディスク構成変更: NVMe 256GB + SSD 2TB + HDD 8TB の 3ディスク体制
Added
- •サービス分類体系 —
service_classカラム追加(recurring/one_time/free)、completed_at 1回限りサービスの完了日
- •マイページ サービス詳細 —
/mypage/services/{order} タイプ別タブ管理(ホスティング/ドメイン/メール/保守/オプションサービス)
- •サービス管理API —
api/service-manage.php(自動延長トグル、延長申請、メインドメイン設定、メールパスワード変更)
- •管理者注文管理 —
/admin/service-orders 注文一覧 + 詳細ページ、1回限りステータスモーダル(受付/進行中/保留/キャンセル/完了)
- •管理者メニュー — サイドバーに「サービス注文」メニュー追加(position: 65)
Added
- •phone-display — 電話番号表示コンポーネント(サーバーサイド
format_phone() ヘルパー)、JS依存なし
- •format_phone() — PHP国際電話番号フォーマット関数(韓国/日本/アメリカ/中国/イギリス/フランス/ドイツ/オーストラリアなど)
- •無料ドメイン設定 — 管理者設定で無料サブドメインリスト管理(
service_free_domains)、複数ドメインセレクト対応
Fixed
- •無料サービス購読の欠落 — 無料注文時にドメイン/オプション/保守などの購読レコードが未作成 → 全サービス一括生成にリファクタリング
- •決済セクションの利用規約同意 — 無料注文時に規約チェックボックスが決済セクションと一緒に非表示になる問題 → セクション外に分離
- •updateSubmitButton isFree判定 —
btn.closest('form') NULL → document.querySelectorで修正
- •管理者サイドバーのアクティブ表示 —
$adminPath未定義で全メニューが非アクティブ → 変数宣言を追加
- •マイページアバター — services.php/service-detail.phpに
use Auth + $user = Auth::user()が欠落
- •オプションサービス1回限りチェック — 管理者設定の
one_timeフラグが注文時のservice_classに反映されるよう修正
- •1回限りサービスの初期状態 —
active→pending(受付)として作成されるよう修正
Changed
- •注文APIリファクタリング — 3つの決済経路(無料/カード/銀行振込)の購読作成コードを
$subscriptionData + _insertSubscriptions()共通関数に統合
- •サービス一覧UI — インライン展開 → カードリンク + 詳細ページ分離
- •電話番号表示 — プロフィール/会員一覧/スタッフ一覧に
format_phone()適用
- •無料ドメインの動的化 —
.21ces.netハードコード → 管理者設定値を参照
v2.1.1-hotfix
2026-04-16 · 6か月前
Fixed
- •フッターメニュー 404 エラー —
rzx_page_contents テーブルに法的文書ページ(terms, privacy, refund-policy, data-policy, tokushoho, funds-settlement)のデータが欠落 → test DB から原本を復元
- •ウィジェットビルダーの画像/動画アップロード失敗 — フロントラッパー(
page-widget-builder.php)からの FormData POST が AJAX ハンドラに渡されない問題を修正(ファイルアップロード条件追加 + ob_end_clean/exit 処理)
- •アップロードディレクトリのパーミッション —
storage/uploads/widgets/ のオーナーを www-data に変更し、PHP-FPM の書き込み権限を確保
Added
- •サービス申込メニューの多言語対応 —
rzx_translations テーブルに menu_item.19.title の13言語翻訳を追加
- •ヒーロー CTA ウィジェットの多言語対応 — Dev ページヒーローバナーの title・subtitle・button text に13言語翻訳を適用
- •アップロード状態プレビュー — 画像/動画アップロード時に進行中(スピナー)・成功(チェックマーク)・失敗(エラーメッセージ)のビジュアルフィードバックを追加
Added
- •Step 0 言語選択画面 — インストール開始前に13言語から選択。以降、UI全体が選択した言語で表示される
- •インストール翻訳ファイルを分離 —
resources/lang/install.php(13言語 × 45文字列)
- •会員ランクの多言語化 — Normal/Silver/Gold/VIP を13言語で自動生成
Added
- •config/admin-menu.php — コア管理者メニューを設定ファイルに分離(Coreアップデート時に保持)
- •admin-sidebar.php のリファクタリング — 731行のハードコード → 約200行の動的レンダラー(config + plugin.json ベース)
- •vos-shop plugin.json — ハードコードされたメニューを
menus.admin 形式に移行
Added
- •スライドインメニュー — モバイル: アバター+名前のトグルバー → 左スライドインオーバーレイ(300ms ease-out)
- •フェードディム背景 — 背景クリックまたはXボタンで閉じる。body スクロールをロック
Added
- •force_locale — デフォルト言語を強制適用(
?lang=xx パラメータでユーザー変更可能)
- •default_language — install.php ↔ Translator 設定キーを統一
- •URLパラメータ —
?lang=xx を最優先で検出し、セッション/クッキーに保存
Fixed
- •FAQ スキン未適用 — マイグレーション SQL がデフォルト掲示板の
INSERT を先に実行したため、install.php の INSERT IGNORE が無視される問題を修正
- •translations テーブルの source_locale 欠損 — コアマイグレーションにカラムが不足 → db_trans() が完全に失敗 → ユーザー情報/メニュー/多言語が表示されない問題を修正
- •設定タブのサイドバーアクティブ表示 —
route_prefix 属性を追加し、設定配下のすべてのルートで設定メニューをアクティブに保つ
- •インストールセッション残留バグ — .env のない新規インストール時に以前のPHPセッションが残り、Step 0がスキップされる問題を修正
- •nginx 403 — admin/ の物理ディレクトリとルートの競合を修正(
try_files $uri/ を削除)
- •難読化スクリプトのバージョンハードコード — obfuscate.php が version.json から動的にバージョンを読み込むよう修正
Changed
- •グリッド/board-contents ウィジェットの多言語ビュー — rzx_translations の翻訳検索を追加(現在のロケール → 英語フォールバック)
- •サイト業種カテゴリ — 15個 → 26個に拡大(法人、ショッピングモール、法律、会計、IT、メディアなど13言語)
- •グリッドウィジェット設定 — grid-section の render.php をネイティブセルタイプ(
board-list)に変更、13言語タイトル
- •Step 4 言語選択 — 5言語 → 13言語に拡大、インストール言語で事前入力
- •タイムゾーン選択 — 13言語ユーザー対応の12タイムゾーンに拡大
v1.26.0
2026-04-01 · 7か月前
Added
- •サービス選択画面上部にバンドル(セット)サービスを3列表示 — アンバーカラーのテーマで個別サービスと視覚的に区別
- •SET バッジ、イベント割引ラベル、含まれるサービス名、バンドル価格、定価の取り消し線、割引率の表示
- •バンドル選択時、含まれるサービスを自動選択(価格はバンドル価格で計算)
- •バンドルに含まれるサービスは個別にトグル不可(誤った価格計算を防止)
- •指名モード:
rzx_staff_bundles テーブルでスタッフごとのバンドルをフィルタリング
- •
bundles パラメーターを確認ページへ渡す
- •多言語対応: バンドル関連のキオスク翻訳キーを13言語に追加
Added
- •ビュー切替ボタン — 上部バーに
[月] [週] [日] トグル(アクティブ状態: 青色)
- •週間ビュー — 左縦軸=曜日、上横軸=時間軸
- •横スクロール、予約ブロックが時間バー形式で表示
- •レーンアルゴリズム: 時間の重複を検出し自動で下段に配置、行の高さ可変
- •左サイドバー ↔ グリッドの縦スクロールを同期
- •日別ビュー — 横=時間軸、縦=レーン(週間ビューと同じ方式)
- •営業時間ベースの時間範囲 —
business_hour_start/business_hour_end 設定に基づき、範囲外の予約は自動拡張
- •空セルクリック時刻の受け渡し — 週間/日別ビューでクリック X 座標 → 15分単位の時刻計算 → 予約モーダルの開始時刻に自動入力
- •上部ナビバーを固定 —
overflow-x-hidden + sticky 適用、横スクロール中もビューポート内に固定
Added
- •管理者 > 設定 > 一般 — 営業開始/終了時刻の設定 UI を追加
- •
business_hour_start, business_hour_end DB 設定キー
- •カレンダーの週間/日別ビューのデフォルト時間範囲に適用
Fixed
- •POS
add-service の欠損フィールド修正 — start_time, end_time, staff_id, designation_fee, notes の受け渡しを追加(従来: サーバー側で時刻がハードコード、スタッフ/メモが欠落)
- •end_time の日付をまたぐ問題を防止 —
ReservationHelper、start-service API、予約フォームの calcEnd() すべてに % 24 → min(23:59) 上限を適用
- •POS の利用中判定で日付をまたぐ対応 —
CustomerBasedAdapter で end_time < start_time の場合に深夜越えとして処理
- •予約バンドル検証 — バンドルのみ選択し個別サービス未選択でも予約作成できるように修正
Changed
- •タブ名の変更: 受付 / 受付一覧 / 予約者
- •受付一覧:
walk_in, pos, kiosk, admin ソース — 全ステータスを表示
- •予約者:
phone, online ソース — 全ステータスを表示
- •並び順: 待機 → 確定 → 利用中 → 完了 → ノーショー → キャンセル、同一ステータス内は時間順
- •完了/キャンセル/ノーショー行:
opacity-50 で薄く表示、未割り当てバッジを表示
Changed
- •完了バッジ: グレー → グリーンに変更
- •キャンセル/ノーショーバッジを追加(件数が 0 の場合は非表示)
Added
- •カード下部: 待機状態のカードにノーショーボタンを追加(禁止アイコン)、キャンセルボタンを赤色に変更
- •詳細モーダル:
pending、confirmed 両方のステータスでノーショーアクションボタンを表示
- •グループ一括ノーショー:
POS.noShowAllServices() 関数を追加
Fixed
- •予約詳細の戻るナビゲーション —
<a href="/reservations"> → history.back() に変更、前のページに戻るように修正
- •多言語: カレンダービュー切替(月/週/日)、バンドル、営業時間関連キーを13言語に追加
v1.25.0
2026-04-01 · 7か月前
Architecture
- •POSを独立プラグイン構造に分離
- •
resources/views/admin/reservations/pos-*.php → resources/views/admin/pos/ ディレクトリへ移動
- •
pos/ ディレクトリの有無でPOS機能を自動有効化/無効化(is_dir() チェック)
- •サイドバーメニュー:
pos/ ディレクトリがない場合はPOSメニューを自動非表示
- •
index.php ルーティング: pos/ ディレクトリがない場合はPOSルートを無効化
- •
pos/_init.php → 予約共通 _init.php に委譲(DB・認証・多言語を共有)
- •APIエンドポイントは
reservations/_api.php に維持(後方互換性を保証)
Added
- •統合決済モーダル — ポイント + 現金 + カードの同時使用(複合決済)
- •ポイント: 残高照会、手動入力または全額使用
- •現金: 金額入力
- •カード: 金額入力 + 「残高全額」自動入力ボタン
- •分割払い: 一括払い / 2〜12回選択
- •リアルタイムで合計・お釣り・不足金額を自動計算
- •Stripeカード決済時は現金/ポイントをカード決済成功後のみ処理(キャンセル時も安全)
- •サービス詳細モーダル — ポイント表示
- •ヘッダーエリアに会員のポイント残高を常時表示(残高0でも表示)
- •サービス詳細モーダル — スタッフバッジ改善
- •アサイン/指名バッジをスタッフ名の前に表示(従来: 名前の下)
- •領収書/印刷ボタンの位置変更
- •顧客詳細情報の上へ移動、領収書(左)+ 印刷(右)配置
- •印刷機能の改善
- •外部ページではなく、現在のサービス詳細モーダルの内容を印刷
Changed
- •カードレイアウト — gridベース → flex-wrap固定サイズカード
- •カードサイズ固定: デフォルト320×240px(small: 260×200、large: 380×280)
- •画面サイズに依存せずカードサイズが変わらず、自動で折り返し
- •カード決済モーダル — 幅1030px、高さ800pxに拡大
Fixed
- •APIのcross-originエラーを解消
- •
$baseUrl が .env の APP_URL に固定されており、他のホスト/HTTPS接続時にfetchが失敗
- •ダッシュボード: fetch URLを相対パス(
/update-api.php)に変更
- •予約
_init.php: $baseUrl を空文字列に変更し、全fetchが相対パスを使用
- •Cloudflare HTTPSプロキシ環境でのmixed-contentの問題を完全解消
- •DBマイグレーション実行エラー — "Failed to fetch" を解消(cross-originの問題)
- •Stripe複合決済キャンセル時の現金先払いバグ
- •修正前: 現金を先に処理 → カード決済キャンセル時に現金がすでに処理済み
- •修正後: Stripeカード決済成功後にのみ現金/ポイントを処理
i18n
- •
pos_pay_after_points — ポイント適用後の金額
- •
pos_pay_proceed — 決済を進める
- •
pos_pay_remainder — 残高全額
- •
pos_pay_installment — 分割払い
- •
pos_pay_lump_sum — 一括払い
- •
pos_pay_months — 回
- •
pos_pay_total_pay — 合計
- •
pos_pay_short — 不足
- •
show_receipt — 領収書
- •
show_print — 印刷
v1.18.0
2026-03-29 · 7か月前
Added
- •多言語日付フォーマット関数 —
formatReservationDate($dateString, $locale)
- •13言語対応 (ko, en, ja, zh_CN, zh_TW, de, es, fr, id, mn, ru, tr, vi)
- •予約詳細ページで日付・曜日を自動的に多言語表示
- •フォールバック: 未対応ロケール → 英語形式
Changed
- •予約詳細ページの多言語処理
- •サービス名・スタッフ名・バンドル名の多言語対応(DB の translations テーブルに基づく)
- •日付フォーマット関数を統合
- •支払いステータスラベルの多言語対応(payment_status フィールド)
- •支払いステータスの多言語対応
- •全言語ファイル(11言語)に
payment セクションを追加
- •未払い・支払済み・一部支払い・返金の翻訳
Fixed
- •予約詳細ページ: 多言語化されていなかったスタッフ名・サービス名が正しく表示されるように修正
- •支払いステータスラベル: 韓国語でのみ表示されていた問題を修正
- •
_tr() 関数ベースの多言語処理に統一
Layout & UI
- •ページ幅の統一 (max-w-5xl → max-w-7xl)
- •掲示板ページ(一覧・閲覧・投稿): max-w-5xl → max-w-7xl
- •外部ページ(page.php): デフォルト値および DB 設定値を更新
- •予約詳細・予約照会・スタッフページ: DB 設定値を更新
- •結果: 全ページの幅が予約ページと統一された
Documentation
- •COMPONENT_MANUAL.md に
formatReservationDate() の詳細ドキュメントを追加
- •対応言語とフォーマット一覧
- •使用例と内部構造
- •注意事項と関連関数
v1.16.0
2026-03-23 · 7か月前
Added
- •モバイル下部メニューバー — スタッフ/予約/ホーム/ログイン(またはマイ)/会員登録/もっと見る、現在ページのハイライト表示
- •モバイル「もっと見る」パネル — メインメニュー + マイページ/ログアウト
- •レイアウト/スキン設定の実反映 — site_layout, site_page_skin, site_board_skin, site_member_skin → レンダリングに反映
- •no_layout パラメータ — レイアウトなしでコンテンツのみ(プレビュー用)
- •多言語追加 — common.nav.staff, common.nav.more(13言語)
Fixed
- •会員ページ(login/register/forgot/reset)へのレイアウト適用: スキンの
<main> 抽出で重複ヘッダーを除去
- •会員スキンの ImageCropper/ProfilePhotoCropper 重複宣言エラーを修正
- •メニューローダーの include_once 問題: スキンクロージャ内で先に読み込まれた場合に base-header メニューが欠落する問題を修正
- •
apple-mobile-web-app-capable deprecated → mobile-web-app-capable(8ファイル)
- •モバイルでヘッダーのログイン/会員登録ボタンを非表示(下部メニューバーに置換)
- •下部メニューバーの iOS safe-area 対応
Changed
- •会員ページを独自レイアウトからデフォルトレイアウトに統合(login/register/forgot/reset)
- •フッター下部の余白を削除(モバイルメニューバーは fixed 配置)
v1.15.3
2026-03-22 · 7か月前
Added
- •レイアウト詳細設定パネル — SkinConfigRendererベースの設定フォームをAJAXで読み込み
- •レイアウトメニュー設定 — layout.jsonのmenusセクション → DBのサイトマップドロップダウンを自動生成
- •SkinConfigRendererタブ対応 — varsに
tabプロパティを追加するとタブUIが自動生成
- •SkinConfigRendererリファクタリング —
renderVar()単一メソッドに統合、renderFormFlat/renderFormWithTabsを分離、renderDependsOnJsを共通化
- •layout.json拡張 — menus(GNB/FNB)、vars 14項目(ヘッダー/ロゴ/カラー/フッター/カスタム)、13言語
- •レイアウトプレビュー連携 — "無効"選択時は ?no_layout=1 でレイアウトなしのプレビューを表示
Fixed
- •レイアウト管理メニューのクエリ:
rzx_menus → rzx_sitemaps テーブル名を修正
- •中央パネルの幅調整 + アクションリンクの whitespace-nowrap
Pending
- •レイアウト/スキン設定値の実際のページレンダリングへの適用(次セッション)
v1.15.2
2026-03-22 · 7か月前
Added
- •レイアウト管理ページ — 3ペイン構成: 左側プレビュー+メニュー、右側スキン一覧、詳細設定パネル
- •スキン項目ごと: サムネイル + 詳細設定/コピー作成/削除アクションリンク
- •「無効化」/「別のスキンをインストール」オプション
- •4カテゴリ保存: レイアウト、ページ、掲示板、会員(
site_layout、site_page_skin、site_board_skin、site_member_skin)
Changed
- •「デザイン管理」→「レイアウト管理」に名称変更(13言語: admin.php + site.php)
v1.15.1
2026-03-22 · 7か月前
Changed
- •サイト管理15ページ →
_head.php 共用ヘッダーを適用
- •掲示板: boards, boards-create, boards-edit, boards-trash
- •メニュー: menus
- •デザイン: design
- •ページ: pages, pages-settings, pages-edit-content, pages-document, pages-compliance, pages-widget-builder
- •ウィジェット: widgets, widgets-create, widgets-marketplace
- •embedモードのページ(boards-edit, pages-settings, pages-edit-content)は非embed時のみ
_head.php を適用
- •管理者ページ全体のヘッダー/レイアウト統一が完了
v1.15.0
2026-03-22 · 7か月前
Added
- •システムウィジェットモジュール — 4種類のウィジェット: staff(スタッフ紹介)、booking(予約する)、lookup(予約照会)、cta001(予約誘導バナー)
- •システムページ — staff、booking、lookup をDB登録(is_system=1)+ ルーティング(
/staff、/booking、/lookup)
- •ウィジェットベースのページレンダリング — staff/booking/lookup ページはウィジェット配置時にウィジェットレンダリング、未配置時は既存フォールバック
- •ウィジェット自動DB登録 —
syncToDatabase() 呼び出しでウィジェットディレクトリ追加時に自動登録
- •ウィジェットカテゴリ
system — 13言語翻訳(widgets.categories + widget_builder.cat)
- •ページ一覧統合 — システムページのループレンダリング + ギア/編集/プレビューアイコンの統一
- •管理者ページヘッダー統合 —
$pageSubTitle + $pageSubDesc(_head.php での共通出力)
- •翻訳キー追加 — staff.admins、staff.attendance.report/stats、points.description など
Fixed
- •ウィジェットビルダーの
page_slug = 'home' ハードコード → $_GET['slug'] による動的処理
- •ウィジェットビルダー AJAX save/preview の
home ハードコード → $pageSlug 動的化
- •ウィジェットビルダープレビューURL →
$pageSlug 動的化(ホーム固定 → 各ページ)
- •ウィジェット preview_widget の WidgetLoader require 漏れを修正
- •サービスカードビューの画像パス(
/storage/ プレフィックス)
- •キオスク設定の幅
max-w-3xl → 100% に統一
- •POS ヘッダー「予約管理」→「POS」に変更
Changed
- •スタッフ管理10ページ + 会員管理4ページ →
_head.php 共通ヘッダー適用
- •キオスク/バンドルページへの
_head.php 適用完了
- •キオスク言語設定 grid → flex-wrap レスポンシブ
- •ページ一覧のシステムページをデータ駆動ループでレンダリング
v1.14.1
2026-03-22 · 7か月前
Added
- •ページスキンタブ — スキン基本情報 + 拡張変数設定(SkinConfigRendererベース)
- •全ページタイプへのスキン適用 — document/widget/external すべてにスキン設定を適用
- •タイトル背景システム — 画像/動画背景 + オーバーレイ + テキスト色(共通パーシャル
_page-title-bg.php)
- •depends_on システム — skin.json でフィールド間の依存関係を宣言的に定義、レンダラーが JS を自動生成(checkbox/radio 対応)
- •スキンファイルアップロード — マルチパート転送で画像/動画アップロード(
storage/skins/page/{skin}/)
- •カード型レイアウト/スキン選択 — モジュール情報タブでサムネイルカードUIに変更
- •SEOシステム — SEOヘルパー、タイトルパターン、OG/Twitter メタタグ、コンテンツ抽出
- •OG Imageアップロード — URL入力 + ファイルアップロード + プレビュー
- •共通結果モーダル — 保存成功/失敗モーダルUIを統合(13言語対応)
- •サービスカードビュー — 全体背景画像カード + テーブル/カード切り替えボタン
- •サービスのドラッグ&ドロップ並べ替え — テーブル/カード両ビューで順序変更 + DB保存
- •予約スタッフ配当/指名 — 予約詳細に配当/指名ボタン2つ
- •予約経路UI — 電話予約/現場受付/オンライン選択
- •電話予約設定 — サービス基本設定で有効/無効トグル
- •セキュリティヘッダー — X-Frame-Options + CSP frame-ancestors
- •PAGE_SYSTEM.md — ページシステム開発ドキュメント
- •PRD_OrderSystem.md — テーブル注文システム企画書
- •PRD_KioskSystem.md — キオスクシステム企画書
Fixed
- •ファビコンのDB設定を適用(フロント/管理者/スキンレイアウト 4か所)
- •ダッシュボードマイグレーションURL
window.location.origin → $baseUrl(サブディレクトリ環境)
- •ページ設定embedモードのAPI URL → adminパスを直接指定
- •結果モーダルの多言語: APIレスポンスではなくページレンダリング時のロケールメッセージを使用
- •スキンタブの空スキン値フォールバック(
"" → default)
- •
pages-settings.php の php://input 二重消費問題を解決
Changed
- •キオスク/キオスク設定/バンドルページ →
_head.php 共用ヘッダーを適用
- •スキン設定の保存をJSON → FormData(マルチパート)転送に変更(ファイルアップロード対応)
- •SkinConfigRendererに
$baseUrl パラメータを追加(画像/動画プレビュー)
- •13言語スキン翻訳(skin.json + site.php + common.php)
v1.13.0
2026-03-21 · 7か月前
Added
- •ページシステム完成 — メニューからドキュメント/ウィジェット/外部ページを作成すると自動的にページを生成
- •動的ページレンダラー —
page.php(ドキュメント→HTML、ウィジェット→WidgetRenderer、外部→iframe/include)
- •ページ環境設定 — 3タブ(基本 / レイアウト・スキン / SEO)、
page_config_{slug} JSONで保存
- •ページコンテンツ編集 — 言語別タイトル・コンテンツ編集、スラッグ変更、タイプ変更、削除
- •ページ管理動的リスト — DBからユーザーページを自動読み込み、タイプ別アイコン・バッジ
- •フロント管理者アイコン — ギア(設定)+ 編集(コンテンツ)を分けて表示
- •外部ページiframe — 読み込み失敗時に「新しいウィンドウで開く」案内を表示
- •内部PHP/HTMLファイル — includeでRezlyXレイアウト内にレンダリング
Fixed
- •メニューショートカットURL
#menu_{id} → 実際のメニューURLを保存
- •メニュー編集時に作成時と同じショートカットUI構造を表示
- •メニュー保存時にショートカットURLを反映(
formMenuType → パネル可視性基準)
- •メニュー翻訳を13言語追加(12メニュー項目 × 13言語)
- •ページドキュメントエディターの翻訳キーパスを修正(
admin.site.pages. → site.pages.)
Changed
- •DB
rzx_page_contents に page_type カラムを追加(document/widget/external)
- •メニュー削除時に関連ページ + 翻訳データも一緒に削除
v1.12.5
2026-03-21 · 7か月前
Fixed
- •メニューショートカットURLを修正 —
#menu_{id} の代わりに実際のメニューURLを保存するよう変更
v1.12.4
2026-03-21 · 7か月前
Fixed
- •スキン設定のリストタイプが反映されない問題 — localStorage のキャッシュがスキン設定を上書きする不具合を修正
- •スタイル切り替え非許可時はスキン設定のみ使用、許可時は localStorage を優先
- •checkbox の hidden フィールドの重複送信を除去(未チェック状態は JS で処理)
v1.12.3
2026-03-20 · 7か月前
Fixed
- •掲示板の英語/日本語翻訳キーの欠落を修正 (source_locale, reply, style, board_settings など)
- •カテゴリ名に多言語フォールバックを適用 (ロケール → en → 原文)
- •掲示板一覧の本文多言語化 (ウェブジン/カード/ギャラリー プレビュー)
v1.12.2
2026-03-20 · 7か月前
Fixed
- •掲示板一覧本文の多言語フォールバック — ウェブジン/カード/ギャラリープレビューに翻訳本文を適用(ロケール → en → 原文)
- •本番環境のスキンファイル欠損 —
skins/default/board/ ディレクトリをFTPで作成し、skin.json/サムネイルをアップロード
v1.12.1
2026-03-20 · 7か月前
Fixed
- •本番環境でスキン設定が表示されない問題 — ファイル全体の同期を再整備
- •CLAUDE.md + BOARD_SYSTEM.md のファイル構造を全面更新
v1.12.0
2026-03-20 · 7か月前
Added
- •スキン設定システム完成 — skin.json ベースの動的フォーム生成 + 実際の掲示板への適用
- •セクション区分(基本 / 一覧 / リンク / デザイン / タイトル背景 / カスタム)
- •radio・video タイプを追加
- •画像/動画ファイルのアップロード(FormData multipart)
- •画像/動画の削除機能
- •スキン基本情報テーブル(制作者 / URL / メール / 日付 / バージョン / サムネイル)
- •タイトル背景画像/動画 — 背景タイプ・高さ・オーバーレイ透明度・テキスト色の設定
- •4種の一覧スタイル — 一覧形式 / ウェブジン形式 / ギャラリー形式 / カード形式;スキンファイル分離 + オーバーライド対応
- •ギャラリー形式: フル画像 cover + ホバー時スライドアニメーション
- •ウェブジン形式: サムネイル + タイトル + プレビュー + メタ情報カード
- •お知らせ記事を上部一覧に分離(_list-notices.php)
- •スキン設定の適用 — primary_color, border_radius, posts_per_row, allow_style_switch, show_category, リンク掲示板, Font Awesome, カスタム CSS/HTML
- •skin.json デフォルト値の自動マージ — DB 保存がなくても skin.json のデフォルトが適用される
Fixed
- •skin_config が DB に保存されない不具合(boards-api.php の update アクションに skin_config が含まれていなかった)
- •スキン保存を URLSearchParams → FormData(multipart)に変更(ファイルアップロードに対応)
- •
$_POST['skin_config'] 配列の自動パースに対応
v1.11.3
2026-03-20 · 7か月前
Fixed
- •投稿詳細ページの前後の記事タイトルに多言語フォールバックを適用 (ロケール → en → 原文)
v1.11.2
2026-03-20 · 7か月前
Fixed
- •掲示板一覧タイトルの多言語フォールバック — 全ロケールで翻訳を検索(韓国語限定を解除)、ソース言語を考慮した英語フォールバック
v1.11.1
2026-03-20 · 7か月前
Fixed
- •OGカードの単独URL判定を改善 —
<font> / <span> などのインライン要素内にあるURLも、ブロック親要素まで遡って正しく処理するよう修正
v1.11.0
2026-03-20 · 7か月前
Added
- •URL 自動リンク — 掲示板投稿の本文/エディターで URL を自動検出 →
<a> タグに変換
- •OG リンクプレビューカード — SNS バナー形式(サムネイル+タイトル+説明+ドメイン)のカードを自動生成
- •エディター:URL を入力/貼り付け後に Enter → OG API を呼び出し → カード挿入
- •本文:単独の URL リンク → OG カードに自動変換
- •OgFetcher モジュール — OG/Twitter Card メタデータ抽出、favicon、エンコーディング自動処理
- •OG API —
/board/api/og エンドポイント
- •board-autolink.js — 自動リンク + OG カード統合 JS(base-header からグローバル読み込み)
v1.10.2
2026-03-20 · 7か月前
Fixed
- •エディター/本文の画像揃え — Tailwind preflight の
img { display: block } を上書き
- •
board-content.css 共通 CSS を作成(エディター + 本文表示を統合)
- •
base-header.php からグローバル読み込み(フロントエンド全ページ)
- •
multilang-modal.php にグローバルエディタースタイルを追加(管理画面の全 Summernote)
- •掲示板本文から
prose クラスを削除し、エディターのインラインスタイルを 100% 保持
Changed
- •CLAUDE.md に掲示板本文のスタイルルールを明記(
board-content クラス必須)
v1.10.1
2026-03-20 · 7か月前
Fixed
- •掲示板カテゴリ追加時、多言語モーダルに以前のカテゴリデータが読み込まれるバグを修正(一意の一時 langKey を生成するよう変更)
- •マイグレーション 021 に
comment_max_depth のデフォルト値 3 を追加
v1.10.0
2026-03-20 · 7か月前
Added
- •掲示板拡張変数 — ExtraVarRendererコンポーネントモジュール(15種類:タイプ別 input/display レンダリング)
- •拡張変数の多言語対応 — 言語ごとに拡張変数値を独立保存(rzx_translations 連携、フォールバックチェーン)
- •掲示板投稿の多言語分割保存 — 原文言語で編集時は board_posts に直接保存、他言語は rzx_translations に翻訳として保存
- •掲示板投稿の読み取りフォールバックチェーン — タイトル/本文/拡張変数を「現在のロケール → en → 原文」の順に表示
- •ネスト返信(コメント) — 3段階の深さのネストコメント対応、再帰ツリー並べ替え、インライン返信フォーム
- •コメントのいいね/よくない — コメントごとのいいねボタン + API
- •掲示板設定フロントエンドアクセス — 管理者ギアアイコン → /board/{slug}/settings フロントレイアウト
- •掲示板管理タイトルリンク — 管理者の掲示板一覧でタイトルをクリックするとその掲示板に移動
Fixed
- •掲示板 API 管理者権限確認:
$currentUser['role'] → $_SESSION['admin_id'](4ファイル修正)
- •原文言語の案内メッセージを投稿者/管理者にのみ表示
- •掲示板設定の埋め込みモードタブリンクがフロントエンド URL をサポート
Changed
- •DB
rzx_board_posts に extra_vars JSON カラムを追加
- •
comment_max_depth のデフォルト値を 0 → 3 に変更
- •コメントアクションバーを統合(いいね/よくない/返信/削除アイコン)
Added
- •デフォルト掲示板データ — お知らせ、質問と回答、よくある質問、自由掲示板のマイグレーション(020_default_boards_v193.sql)
Added
- •会員グループ初期化 — デフォルトデータ(7グループ + 13言語翻訳)で初期化する機能
- •ポイント設定初期化 — 設定値/レベルポイント/グループ連動をデフォルト値に戻す(会員残高は影響なし)
- •会員グループ多言語 — グループ名/特典説明に
rzx_multilang_input() 共通コンポーネントを適用
- •会員グループドラッグ&ドロップ — SortableJS によるカード並び替え + 自動保存
Fixed
- •会員グループカードのロケール別翻訳表示(カードビュー + 編集モーダル)
- •会員グループ多言語翻訳データの文字化けを修正(PHP UTF-8 再保存)
- •ポイントモジュール設定の掲示板カラム名修正(board_name → title)
- •ポイント会員一覧の照合順序の競合を解決(utf8mb4_unicode_ci に統一)
- •本番 DB マイグレーション(019_point_system_v190.sql)
Added
- •ポイント(積立金)管理システム — 3タブ構成(基本設定 / モジュール別設定 / 会員ポイント一覧)
- •ポイント3フィールド構造 — point(活動ポイント)、balance(決済積立金)、total_accumulated(累計ポイント、レベル基準)
- •累計ポイント重み付け — 決済ウェイト / 活動ウェイト分離、決済ユーザー優遇レベルアップ
- •ポイント交換 — ポイント → 積立金変換(比率・単位・最小ポイント設定可能)
- •17種類のポイント付与/減算項目 — Rhymix と同一構造(削除時回収、期限付き、公告除外)
- •モジュール別設定 — 掲示板ごとに15項目を個別設定
- •会員ポイント一覧 — 4列(ポイント/積立金/累計/レベル)、検索、個別編集
- •レベルポイント — 数式計算、最高レベル動的調整、グループ連動
- •ポイントシステムドキュメント — POINT_SYSTEM.md 詳細設計書
- •会員グループのドラッグ&ドロップ — SortableJS でカード順序変更 + 自動保存
- •会員グループ多言語対応 — グループ名/特典説明に
rzx_multilang_input() 共通コンポーネントを適用
- •会員グループシードデータ — 7グループ × 13言語の多言語翻訳データ
Changed
- •DB
rzx_member_points に balance、total_accumulated カラムを追加
- •DB
rzx_point_levels.group_id を INT から CHAR(36) に変更(UUID 互換)
- •
rzx_point_levels、rzx_member_points の照合順序を utf8mb4_unicode_ci に統一
- •バンドルページのレイアウトを修正(
sidebar-main-content → flex-1 ml-64 ダッシュボードパターン)
- •バンドルページの通貨単位
$config['currency'] → $siteSettings['service_currency'] に修正
- •サービス所要時間を select → input number + datalist に変更
- •CLAUDE.md に多言語入力 UI ルールを明記(rzx_multilang_input 必須使用)
Added
- •バンドル詳細管理ページ — バンドルの基本情報編集、代表画像アップロード、サービス構成編集、スタッフ連携、有効/無効トグル
- •イベント割引 — バンドルごとのイベント価格、期間(開始/終了)、ラベル設定。期間内に自動有効化
- •バンドル一覧カードデザイン — グリッドカードレイアウト、画像ヘッダー、イベント/割引バッジ、底部固定アクションバー
- •おすすめパッケージ背景画像 — 顧客スタッフ詳細ページのバンドルカードに代表画像の背景 + グラデーションオーバーレイ
- •サービス所要時間の直接入力 — select → number input(5〜480分、5分単位)+ datalist 推奨リスト
Changed
- •DB
rzx_service_bundles にカラム追加: event_price、event_start、event_end、event_label
- •バンドル一覧 API に
total_duration とイベント関連カラムを追加
- •翻訳ファイル(ko、en、ja)にバンドル詳細管理 + イベント割引キーを追加
Added
- •POS設定ページ — カードサイズ、画像/価格/電話表示、透明度、デフォルトタブ、自動更新、通知音、スタッフ配置必須、自動配置
- •POS設定の反映 — カードサイズ/画像/価格/電話/透明度/自動更新/デフォルトタブをすべてPOSに反映
- •スタッフ自動配置 — POS設定で有効化した場合、キオスク受付時に自動配置(対応可能スタッフ + 当日予約最少)
- •POSカードのスタッフバッジ — 配置済み/未配置の表示、未配置時は進行ボタンを無効化
- •POSサービス画像背景 — サービス詳細モーダルのヘッダー+顧客エリアに代表サービス画像の背景を表示
- •スタッフ is_visible — 一覧への表示/非表示、非表示スタッフは予約/POS/キオスクから除外
- •スタッフカードバナー — 管理者スタッフカードにバナー画像 + ステータスバッジ
- •キオスク自動配置 — staff_id=NULL で受付し、管理者がPOSで配置
Fixed
- •POSスタッフ配置後にサービス一覧を即時更新(キャッシュ防止)
- •スタッフ配置APIのパラメータ修正(reservation_id → reservation_ids[])
- •本番環境の欠損テーブル/カラムを多数修正(マイグレーション018の補強)
- •管理者ログアウトルートを追加
- •キオスク認証前ルートの配置
Added
- •ベースレイアウトシステム —
layouts/base-header.php + base-footer.php、index.php で ob_start を自動適用、全顧客ページ共通ヘッダー/フッター
- •掲示板フロントエンド — 一覧・詳細・投稿/編集ページ、Summernote エディタ、ドラッグ&ドロップファイル添付
- •掲示板ショートURL —
/free、/notice/3 など /board/ なしでアクセス可能、DB スラグ自動マッチング
- •予約照会ページ —
/lookup ショートURL、予約番号/メール/電話番号で検索
- •予約詳細ページ —
/booking/detail/{番号}、スタッフ挨拶吹き出し、サービス/決済/キャンセル情報
- •予約キャンセルページ —
/booking/cancel/{番号}、キャンセル理由入力
- •マイページ予約詳細 —
/mypage/reservations/{id}、サイドバー + 詳細情報
- •掲示板多言語 —
original_locale(初回作成言語)+ source_locale(現コンテンツ言語)、フォールバックチェーン(source → en → original)
- •スタッフ挨拶 —
greeting_before(施術前)+ greeting_after(施術後)、多言語対応、予約ステータスに応じて表示
- •管理者プロフィールドロップダウン — プロフィール写真/イニシャル + 名前 + ホームページ/マイページ/ログアウトメニュー
- •顧客ヘッダー管理者リンク — 管理者セッション時にドロップダウンへ管理者ページリンクを表示
Changed
- •全顧客ページのレイアウトを統合(個別 HTML 構造を削除、LayoutManager を自動適用)
- •掲示板カテゴリ表示条件を
show_category → hide_categories に変更
- •掲示板 URL を
/board/free → ショートURL /free に変更(デフォルト)
- •管理者トップバーの "Admin" を実際のログイン名 + プロフィール写真に変更
Fixed
- •
rzx_users.role カラム欠如 → $_SESSION['admin_id'] 基準で管理者判定
- •
rzx_users.nick_name カラム欠如 → name + Encryption 復号化を使用
- •
rzx_staff.profile_image → avatar カラム名に修正
- •Service モデルの
category_id を int→string にキャスト
- •予約照会のメール/電話番号は平文検索(暗号化未適用データ)
Added
- •掲示板管理タブ6つ — 基本設定、カテゴリ管理、拡張変数、権限設定、追加設定、スキン
- •基本設定タブの統合 — 基本情報 + SEO + レイアウト選択 + スキン選択 + 表示 + 一覧 + 詳細設定(折りたたみ/展開)
- •共通コンポーネント —
components/board/section-*.php 8ファイル(basic, seo, layout-select, skin-select, display, list, advanced, js)、作成/編集ページで再利用
- •多言語入力コンポーネント —
rzx_multilang_input() 関数、text/editorモード、インライン地球儀ボタン
- •カテゴリ管理の強化 — ツリー構造(parent_id)、編集モーダル(名前/フォント色/説明/許可グループ/展開/デフォルトカテゴリ)、SortableJSドラッグ並べ替え、会員等級DBの動的ロード
- •拡張変数タブ —
rzx_board_extra_varsテーブル、15種の入力タイプ(text_multilang, textarea_multilang, textarea_editor含む)、多言語対応、ドラッグ並べ替え
- •権限設定タブ — アクセス権限(all/member/grade:*/admin_staff/admin)、モジュール管理者(共用ユーザー検索、プロフィール写真、権限範囲)、通知メール案内
- •追加設定タブ — 統合掲示板、文書(履歴/おすすめ/通報)、コメント(数/深度/承認/おすすめ/通報)、WYSIWYGエディタ(権限マトリクス)、ファイル(ダウンロードグループ)、フィード(RSS公開/著作権)
- •スキンシステム —
skin.jsonフォーマット、SkinConfigRenderer、"multilang": true対応、スキン情報カード
- •レイアウトシステム —
layout.jsonフォーマット、基本設定でカード形式選択
- •共用ユーザー検索 —
user-search.phpコンポーネント、暗号化/復号化、プロフィール写真、どこでも再利用可能
- •モジュール管理者 —
rzx_board_adminsテーブル、文書/コメント/設定権限、通知受信
- •詳細設定の拡張 — 管理者を匿名から除外、Data URL制限、Unicode乱用、投稿/コメント保護(コメント数/返信数/期間)、スーパー管理者保護、送信者メールアドレス
- •トグルスイッチUI — すべてのはい/いいえ項目をトグルに変換(基本 + 追加設定)
- •翻訳キー — 約300キー、13言語
Fixed
- •ゴミ箱SQLエラー —
LIMIT ?バインディング文字列 → 整数リテラル
- •Summernote未レンダリング — jQuery/Summernote JSロード + モーダル表示後に初期化
- •照合順序エラー — board_admins JOIN時に COLLATE utf8mb4_unicode_ci を明示
- •折りたたみ/展開が動作しない —
toggleSection関数を<head>で先に定義
Changed
- •独立タブ(一覧/詳細設定)→ 基本設定タブに折りたたみ/展開で統合
- •スキン選択 → 基本設定タブに移動、スキンタブは設定のみ表示
- •管理者メール → 詳細設定の「送信者メールアドレス」に変更
- •モジュール管理者 → 権限設定タブに移動
- •「一覧にカテゴリを表示」→ カテゴリ設定から削除、スキン別設定へ移行
- •「一覧にカテゴリを表示」→ カテゴリ設定から削除、スキン別設定へ移行
- •投稿許可グループ → ハードコードから
rzx_member_gradesテーブルの動的ロードに変更
Added
- •多言語フォールバックシステム:
db_trans() 関数に組み込みフォールバックチェーン(設定言語 → en → デフォルト言語 → source_locale → 任意の翻訳)
- •掲示板設定の多言語ボタン: 基本設定タブの6フィールドに多言語(地球儀)ボタンを追加
- •掲示板フロントビューの多言語フォールバック:
_init.php でtitle、description、SEO、header/footerの多言語を適用
- •ウィジェット多言語フォールバック:
WidgetRenderer::t()、tBtn() の空文字列処理を改善
- •PWA翻訳キーを追加(13言語:
admin.pwa.update_available、update、later)
Fixed
- •Featuresウィジェットの空カード問題:
?? 演算子が空文字列 "" を有効値として扱っていた → !empty() ベースのフォールバックに修正
- •本番環境のMixed Contentエラー:
APP_URL http→https修正 + JSプロトコル自動補正
Added
- •POSサービス履歴からのサービス削除機能(削除ボタン + API + DOM即時更新)
- •13言語のサービス削除関連翻訳キーを追加
Added
- •キオスク受付システム: サービス確認 → 顧客情報 → 予約作成 → 待ち番号発行
- •スタッフ稼働状況バッジ: キオスクのスタッフ選択で対応中/対応可能をリアルタイム表示
- •国際電話番号モジュール: キオスク受付フォームに phone-input コンポーネントを適用
- •予約サンプルデータシード:
database/seed_reservations.php(POS/キオスク/オンライン 10件)
- •キオスク共通ファイルを分離(
_styles.php, _bg.php, _scripts.php)
- •13言語にキオスク翻訳キーを11個追加
Changed
- •キオスクのサービス選択: スタッフのスキルに基づくフィルタリング(指名モード)
- •キオスクのカテゴリタブを中央寄せ
Fixed
- •本番環境で管理者がログインできない不具合(パスワードハッシュ破損 — bash の
$ 変数展開の問題)
- •アップデートシステムの安定化: 保持リストの拡張、ヘルスチェック、DBバージョン同期
- •バージョンの単一ソースを統合(
version.json → index.php、DB自動同期)