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_nameoption_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 を使っているなら、この事実を知っておくだけで、開発中の検証の選択肢が広がります。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark