PukiWikiに下書き機能を追加しました。ページの編集中に内容を一時保存し、後で編集を再開できます。
編集中のページを下書きとして保存できます。本文には影響しません。
保存した下書きを読み込んで、編集を再開できます。
すべての下書きを一覧表示し、編集・公開・削除ができます。
- ページの編集画面を開きます
- 内容を編集します
- 「下書き保存」ボタンをクリックします
- 「下書きを保存しました」と表示されます
既に下書きがある場合は、確認ダイアログが表示されます。「OK」を選択すると上書き保存されます。
- 下書きがあるページの編集画面を開きます
- 画面上部に「下書きが保存されています」と表示されます
- 「下書きから復帰」ボタンをクリックします
- 下書きの内容が読み込まれます
?cmd=draftにアクセスして下書き一覧を開きます- 編集したい下書きの「編集」リンクをクリックします
- 下書きの内容が展開された状態で編集画面が開きます
?cmd=draftにアクセスして下書き一覧を開きます- 公開したい下書きの「公開」リンクをクリックします
- 確認ダイアログで「OK」をクリックします
- 下書きが本文として公開され、下書きは削除されます
?cmd=draftにアクセスして下書き一覧を開きます- 削除したい下書きの「削除」リンクをクリックします
- 確認ダイアログで「OK」をクリックします
- 下書きが削除されます
オリジナルのPukiWikiと比べて、以下のファイルが追加・変更されています。
| ファイル | 説明 |
|---|---|
draft/ |
下書きデータを保存するディレクトリ |
lib/draft.php |
下書き操作関数のライブラリ |
plugin/draft.inc.php |
下書き管理プラグイン(一覧・公開・削除) |
DRAFT_FEATURE.md |
下書き機能の詳細ドキュメント(英語) |
| ファイル | 変更内容 |
|---|---|
pukiwiki.ini.php |
DRAFT_DIR定義を追加 |
lib/init.php |
DRAFT_DIRのチェック処理を追加 |
lib/html.php |
編集フォームに下書きボタンと通知を追加 |
plugin/edit.inc.php |
下書き保存・読み込み処理を追加 |
draft/[ページ名の16進数エンコード].txt
例: FrontPage の下書き → draft/46726F6E7450616765.txt
#draft_saved:2025-11-15T12:00:00+09:00
ページの内容...
1行目がメタデータ(保存日時)、2行目以降が下書き本文です。
- 下書きの操作には、対象ページの編集権限が必要です
- ページ編集権限のチェックと同じ仕組みを使用しています
下書き機能を使用するには、draft/ ディレクトリが書き込み可能である必要があります。
chmod 777 draft/- 任意のページの編集画面を開く
- 「下書き保存」ボタンが表示されることを確認
- 内容を入力して「下書き保存」をクリック
- 「下書きを保存しました」と表示されればOK
下書き一覧(?cmd=draft)へのアクセスは以下の条件で制限されています。
PukiWikiが読み取り専用モード(PKWK_READONLY = 1)の場合、下書き一覧にアクセスできません。
// pukiwiki.ini.php
define('PKWK_READONLY', 1); // 読み取り専用モードこの場合、?cmd=draft にアクセスすると以下のエラーが表示されます:
Prohibited by admin (READONLY mode)
編集認証が有効($edit_auth = 1)な場合、ログインユーザーのみが下書き一覧にアクセスできます。
// pukiwiki.ini.php
$edit_auth = 1; // 編集認証を有効化ログインしていない場合のアクセス:
Authentication required to view draft list
ログイン済みの場合:
- 下書き一覧にアクセス可能
- 自分の下書きだけでなく、すべての下書きが表示されます
編集認証が無効($edit_auth = 0、デフォルト)な場合:
- 誰でも下書き一覧にアクセスできます
- すべての下書きが表示されます
セキュリティに関する注意:
- 認証を有効にすることを推奨します
- 認証が無効な場合、誰でも下書きを閲覧・編集・削除できます
原因: draft/ ディレクトリのパーミッションが不足している
解決方法:
chmod 777 draft/原因: JavaScriptが無効になっている、またはブラウザの互換性の問題
解決方法:
- ブラウザのJavaScriptを有効にする
- 下書き一覧(
?cmd=draft)から「編集」リンクをクリックして復帰する
原因: ブラウザがJavaScriptのconfirm()をブロックしている
解決方法:
- ブラウザの設定でポップアップを許可する
- または、ダイアログが表示されなくてもそのまま進めてOK
原因1: 読み取り専用モードが有効になっている
解決方法:
// pukiwiki.ini.php
define('PKWK_READONLY', 0); // 読み取り専用モードを無効化原因2: 認証が有効だがログインしていない
解決方法:
- ログインする(認証情報が必要)
- または、認証を無効にする(推奨しません)
// pukiwiki.ini.php $edit_auth = 0; // 編集認証を無効化
GPL v2 or later (PukiWiki本体と同じライセンス)
- 実装日: 2025年11月15日
- 対応バージョン: PukiWiki 1.5.4
- 下書き機能バージョン: 1.1.0
- アクセス制御機能を追加
- 読み取り専用モード(PKWK_READONLY)でのアクセス制限
- 編集認証($edit_auth)有効時のログインユーザー制限
- 初回リリース
- 下書き保存・読み込み機能
- 下書き一覧・管理機能
- 下書き公開・削除機能
- 下書き機能バージョン: 1.0.0
より詳細な技術情報や開発関連ドキュメントは、.claude/docs/ ディレクトリを参照してください。
- DRAFT_FEATURE.md: 下書き機能の詳細仕様
- TODO.md: 開発タスクと進捗状況
- RELEASE_NOTES_v1.1.0.md: v1.1.0 リリースノート
- LOCAL_SETUP.md: ローカル開発環境セットアップガイド
PukiWikiはPHP製のWikiエンジンで、以下の構造を持ちます。
pukiwiki_draft2/
├── index.php # エントリーポイント
├── pukiwiki.ini.php # 設定ファイル
├── lib/ # コアライブラリ
│ ├── pukiwiki.php # メイン処理
│ ├── init.php # 初期化処理
│ ├── html.php # HTML生成
│ ├── func.php # 共通関数
│ ├── file.php # ファイル操作
│ ├── auth.php # 認証・権限
│ ├── draft.php # 【追加】下書き操作
│ └── ...
├── plugin/ # プラグイン
│ ├── edit.inc.php # ページ編集【変更】
│ ├── draft.inc.php # 【追加】下書き管理
│ └── ...
├── skin/ # スキン(テーマ)
│ ├── pukiwiki.skin.php
│ └── js/
│ └── autosave.js # 【追加】自動保存機能
├── wiki/ # ページデータ(テキスト形式)
├── draft/ # 【追加】下書きデータ
├── attach/ # 添付ファイル
└── backup/ # バックアップデータ
index.php→lib/pukiwiki.phpを呼び出しlib/init.phpで初期化(設定読み込み、ディレクトリチェックなど)?cmd=xxxパラメータに基づいてプラグインを実行- 例:
?cmd=edit→plugin/edit.inc.phpのplugin_edit_action()を実行
- 例:
- プラグインが HTML を生成して返す
lib/html.phpでページ全体のレイアウトを構築- レスポンスを出力
- プラグイン命名規則:
plugin/xxx.inc.php→plugin_xxx_action()関数 - アクションプラグイン:
plugin_xxx_action()- ページ全体を生成 - ブロックプラグイン:
plugin_xxx_convert()- Wiki記法内で使用 - インラインプラグイン:
plugin_xxx_inline()- 行内で使用
- lib/draft.php: 下書き操作の中核ライブラリ(保存・読み込み・削除)
has_draft()- 下書き存在確認get_draft()- 下書き取得draft_write()- 下書き保存draft_delete()- 下書き削除get_draft_list()- 下書き一覧取得
- plugin/draft.inc.php: 下書き一覧・管理UI(
?cmd=draft)plugin_draft_action()- メイン処理plugin_draft_list()- 一覧表示plugin_draft_delete()- 削除処理plugin_draft_publish()- 公開処理
- plugin/edit.inc.php: 編集画面への下書き保存・復帰機能の追加
plugin_edit_draft_save()- 下書き保存処理plugin_edit_load_draft()- 下書き読み込み処理
- lib/html.php: 編集フォームへの下書きボタン・通知の追加
- skin/js/autosave.js: 自動保存機能のJavaScript(30秒間隔で自動保存)
- PHP 8.3 または 8.4 がインストールされている
- ファイルシステムの書き込み権限がある
# PHPビルトインサーバーを起動
php -S localhost:8080
# ブラウザで http://localhost:8080 にアクセス# 下書き機能に必要なパーミッション設定
chmod 777 draft/
chmod 777 wiki/
chmod 777 attach/
chmod 777 backup/
chmod 777 counter/
chmod 777 diff/# PHP構文チェック(変更したファイルを確認)
php -l lib/draft.php
php -l plugin/draft.inc.php
php -l plugin/edit.inc.php
# PHPバージョン確認
php -v下書き機能では以下のセキュリティ対策を実装しています:
- CSRF対策: 全ての状態変更操作にトークンチェックを実装
- XSS対策: 出力時は必ず
htmlsc()でエスケープ - 権限チェック: 全ての下書き操作で
check_editable()を使用 - ファイル操作:
encode()でファイル名を安全化 - アクセス制限: 読み取り専用モードと認証機能に対応
PukiWikiの既存コーディングスタイルに準拠しています:
- 関数命名:
plugin_draft_*(),draft_*()パターン - エラー抑制演算子(
@)の使用は既存コードと同様に許容 - 型宣言: PukiWiki本体が使用していない場合は無理に追加しない
- PHP 8.3/8.4での動作を確保、PHP 9.0も視野
plugin/edit.inc.php- 編集・保存処理のパターンlib/file.php- ファイル操作のパターンlib/auth.php- 認証・権限チェックplugin/freeze.inc.php- CSRF対策の実装例
注意: この下書き機能は、PukiWikiのオリジナル機能ではありません。カスタマイズとして追加されたものです。