wp-now を使っている時のWordPress DBにアクセスする
wp-now でプラグインを開発している際、DBの内容を直接確認したり操作したい場合があります この記事では、wp-now が生成する SQLite ファイルの場所を特定し、sqlite3 コマンドで WordPress […]
目次
wp-now でプラグインを開発している際、DBの内容を直接確認したり操作したい場合があります
この記事では、wp-now が生成する SQLite ファイルの場所を特定し、sqlite3 コマンドで WordPress のオプションを読み書きする方法を紹介します。
DB ファイルはどこにあるか
wp-now は永続データを ~/.wp-now に保存します。公式ドキュメントには次のように書かれています。
In supported modes, wp-now creates a persistent SQLite database and wp-content directory in ~/.wp-now.
plugin モードの場合、プロジェクトごとにハッシュ付きのディレクトリが作られ、その下の database/.ht.sqlite が DB ファイルです。
探すにはターミナルで find を使います。
find ~/.wp-now -name ".ht.sqlite" 2>/dev/null
出力例はこのような形になります。
/Users/yourname/.wp-now/wp-content/my-plugin-a1b2c3d4.../database/.ht.sqlite
ディレクトリ名はプロジェクト名+ハッシュの組み合わせです。複数のプラグインを開発していると .ht.sqlite も複数見つかるので、ファイルの更新日時を見て判断してください。
見つけたパスは変数に入れておくと、以降のコマンドが楽になります。
DB="$HOME/.wp-now/wp-content/my-plugin-xxxxxxxx/database/.ht.sqlite"
オプションを読む
WordPress はプラグインの設定値を wp_options テーブルに保存します。カラムは option_name と option_value のペアで、値は PHP の serialize() で直列化された文字列が入っています。
たとえば、myplugin_ で始まるオプションの一覧を確認するなら次のコマンドです。
sqlite3 "$DB" "SELECT option_name, length(option_value) FROM wp_options WHERE option_name LIKE 'myplugin_%';"
option_value の中身を直接見ることもできます。ただし serialize 形式の文字列は長くなりがちなので、まずは length() で長さだけ確認し、必要なものだけ SELECT option_value で取得するのが実用的です。
オプションを書き換える
SQLiteなので、データの書き換えもできます。操作の前に、必ずバックアップを取ってください。
sqlite3 "$DB" \
"SELECT option_value FROM wp_options WHERE option_name='myplugin_settings';" \
> /tmp/myplugin_settings_backup.txt
バックアップが取れたら、UPDATE で値を差し替えます。
sqlite3 "$DB" \
"UPDATE wp_options SET option_value='a:0:{}' WHERE option_name='myplugin_settings';"
この例では a:0:{} を書き込んでいます。PHP の serialize() で空配列を表す文字列です。ブラウザで管理画面をリロードすれば、「オプションが0件」の状態を即座に確認できます。
復元にはシェルよりも Python を使う
もしバックアップから復元する場合は、Pythonなどのスクリプトを使います。option_value には PHP serialize 形式の文字列が入っています。シングルクォート、ダブルクォート、バックスラッシュ、改行――これらが混在する値をシェルの UPDATE 文に直接埋め込むと、ほぼ確実にエスケープで壊れます。
Python の sqlite3 モジュールならパラメータバインディングが使えるので、値の中身を気にする必要がありません。
python3 << 'PY'
import sqlite3, os
db = os.path.expanduser("~/.wp-now/wp-content/my-plugin-xxxxxxxx/database/.ht.sqlite")
val = open("/tmp/myplugin_settings_backup.txt").read().rstrip("\n")
con = sqlite3.connect(db)
con.execute(
"UPDATE wp_options SET option_value = ? WHERE option_name = ?",
(val, "myplugin_settings"),
)
con.commit()
con.close()
print("restored")
PY
? にバインドされた値はエスケープ処理を sqlite3 モジュールが引き受けてくれます。
まとめ
wp-now のデータベースは ~/.wp-now 配下の .ht.sqlite ファイルです。sqlite3 コマンドで wp_options テーブルを直接読み書きすれば、ブラウザ操作では作りにくい状態を一瞬で再現できます。
操作の流れは3ステップです。find でファイルを探し、SELECT でバックアップを取り、UPDATE で値を差し替える。復元は Python の sqlite3 モジュールでパラメータバインディングを使えば、エスケープの事故を防げます。
MySQL ではなく SQLite だからこそ、DB がただのファイルとして手元にある。wp-now を使っているなら、この事実を知っておくだけで、開発中の検証の選択肢が広がります。