eureka

WordPressのデータベース操作まとめ

2

既存のWordPressプロジェクトをローカルで環境構築していて、管理画面にログインできずSQL文で試行錯誤したのでまとめました。

なお、主にMySQLでの操作とwp-cliでの操作を対象としており、Dockerなどの仮想コンテナは使用しない前提で進みます。

環境

WordPress 5.5.3
MySQL 5.6.51
WP-CLI 2.4.0

SQL文を使用する

SQL文でデータベースを操作する方法です。
文法を覚える必要がありますが、MySQLがインストールされているだけでデータベースの操作ができます。

最初にMySQLが立ち上がっているか確認します。

$ mysql.server status
SUCCESS! MySQL running (16081)

もしも立ち上がっていなければ下記のコマンドで立ち上げます。

$ mysql.server start

補足:停止したい場合はstopを使います。

$ mysql.server stop

SQLを取り込む

sqlファイルが手元にあり、DBに取り込む場合の操作です。

WordPress側で指定しているデータベースがまだなければ、MySQLにログインして作成してからファイルを取り込みます。

データベースがMySQL内に既にある場合は、sqlファイルを取り込むところだけでOKです。

# MySQLにログインする
$ mysql -u root -p

# データベース一覧を参照する
mysql> SHOW DATABASES;

# データベースを作成する
mysql> CREATE DATABASE DB名;

# MySQLからログアウトする
mysql> exit

# sqlファイルを取り込む
$ mysql -u ユーザー名 DB名 < 取り込みたいsqlのファイルパス

SQL文でWordPressのログインユーザを確認する

ログインユーザを知りたいとき

MySQLにログインした状態からの操作です。

DB名は接続するWordPressによって名称が違いますが、テーブルやカラムは接頭辞などの変更をしていなければ同じになるでしょう。

# データベース一覧を参照する
mysql> SHOW DATABASES;

# データベースを指定する
mysql> USE DB名;

# テーブル一覧を参照する
mysql> SHOW TABLES;

# wp_usersテーブルのuser_loginカラムを参照する
mysql> SELECT user_login FROM wp_users;
+-----------------------------+
| user_login                  |
+-----------------------------+
| admin                       |
+-----------------------------+

パスワードを知りたいとき

ログインユーザを参照するのと同様にパスワードも確認することができます。

ただし、パスワードはMD5形式で暗号化されており復号はできません
そのため、パスワードを忘れた場合は諦めて再設定することになります。

# wp_usersテーブルのuser_passカラムを参照する
mysql> select user_pass from wp_users;
+------------------------------------+
| user_pass                          |
+------------------------------------+
| $P$BIby3VGL/krwavU9fkFdbKXWA83pAM/ |
+------------------------------------+

パスワードの再設定

パスワードの再設定はDBから直接やってもいいですが、ユーザ登録時に設定したメールアドレス経由でリセットできるので、そこから変更するのが一番無難です。

とはいえ、SQLでリセットしなければならないときもあるかもしれません。
そんなときのために用意します。

mysql> UPDATE wp_users
    -> SET user_pass = MD5('新しいパスワード')
    -> WHERE user_login = 'パスを変更したいユーザー名';

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

上記のようにSQL文を複数行に分ける場合はセミコロンをつけるのは最後だけですので注意しましょう。

ユーザ情報を細かく取得したいとき

下記のように指定すると縦にユーザ情報が細かく取得できます。
なお、こちらでもuser_passは暗号化されています。

mysql> SELECT * FROM DB名.wp_users \G

*************************** 1. row ***************************
                 ID: 1
         user_login: root
          user_pass: **************
      user_nicename: root
         user_email: root@example.com
           user_url: 
    user_registered: 2018-10-30 09:29:07
user_activation_key: 
        user_status: 0
       display_name: root

管理者権限を持つユーザを調べる

管理者権限はwp_usermetaテーブルで調べることができます。
meta_keyカラムのwp_capabilitiesにadministratorと表示されているユーザが管理者に該当します。

# 管理者権限を持つユーザを調べる
mysql> SELECT * FROM DB名.wp_usermeta
    -> WHERE meta_key
    -> LIKE '%nickname%'
    -> OR meta_key
    -> LIKE 'wp_capabilities';
+----------+---------+-----------------+---------------------------------+
| umeta_id | user_id | meta_key        | meta_value                      |
+----------+---------+-----------------+---------------------------------+
|        1 |       1 | nickname        | admin                           |
|       12 |       1 | wp_capabilities | a:1:{s:13:"administrator";b:1;} |
+----------+---------+-----------------+---------------------------------+

SQL文でWordPressの管理者ユーザを追加する

ログインユーザの追加は通常だと管理画面上から行いますが、なんらかの事情でログインができない場合はDBから直接新しいユーザを追加することになるかと思います。

ユーザ追加のSQL文は下記になります。

※権限付与は最後に追加されたユーザに対して変更を行うため、実行する順序を間違えると他のユーザの権限を変更してしまう恐れがあります。
気をつけて操作しましょう。

# ユーザ作成
mysql> INSERT INTO `wp_users` (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_status`)
    -> VALUES ('ユーザ名', MD5('パスワード'), 'your firstname & your lastname', 'your email', '0');
Query OK, 1 row affected (0.01 sec)

# 最後に追加されたユーザに権限を付与する
mysql> INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`)
    -> VALUES (NULL, (Select max(id) FROM wp_users), 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `wp_usermeta` (`umeta_id`, `user_id`, `meta_key`, `meta_value`)
    -> VALUES (NULL, (Select max(id) FROM wp_users), 'wp_user_level', '10');
Query OK, 1 row affected (0.00 sec)

ユーザを追加しただけで権限を付与しないと、管理画面にログインはできるものの操作が限られます。

SQL文でデータベースのバックアップをとる

MySQL内のデータベースのバックアップをとりたいときは下記で取得できます。
DBは操作を間違えると大変なことになりかねないのでバックアップをとる癖をつけると良いかと思います。

$ mysqldump -u root -p DB名 > 出力先のパス/ファイル名

wp-cliを使用する

続いてはwp-cliを使用する方法です。

wp-cliのインストールが必要になりますが、SQL文を使うよりも簡単にWordPressに関する操作ができるようになります。

wp-cli

wp-cliは便利であるものの、Mac本体のPHPやMySQLに依存するため、複数のWordPressプロジェクトがある場合にはバージョンの違いなどに注意が必要です。

wp-cliで色々なことができますが今回はデータベースに関連し、よく使用しそうなものだけを簡単にピックアップして記載します。

wp-cliでSQLを取り込む

wp-cliを使用すればMySQLにログインせずにデータベースに関する操作ができます。

WordPressのwp-config.phpで指定されているデータベースが既にある場合は取り込むコマンドだけでOKです。

// データベースを作成
$ wp db create DB名

// sqlを取り込む
$ wp db query < 取り込みたいsqlのファイルパス

wp-cliを使用してユーザ一覧を確認する

WordPressのログインユーザ一覧がみたいときに使えます。

$ wp user list
+----+--------------------+--------------------+--------------------+----------------------------+---------------+
| ID | user_login         | display_name       | user_email         | user_registered            | roles         |
+----+--------------------+--------------------+--------------------+----------------------------+---------------+
| 37 | admin              | admin              | sample@email.com   | 2021-06-17 16:56:11        | administrator |
+----+--------------------+--------------------+--------------------+----------------------------+---------------+

wp-cliを使用してユーザを追加する

ユーザを新しく追加したい場合もwp-cliならシンプルです。

下記のコマンドで【ユーザ名】【メールアドレス】【パスワード】を任意のものにして実行するだけです。
もちろん管理者権限で。

$ wp user create ユーザ名 メールアドレス --role=administrator --user_pass=パスワード

参考

2