【2026年10月20日時点の情報です】
このブログの運営では、AI(Claude)に相談しながら、データベースのコマンドをたくさん流してきました。ただ、出してもらったコマンドをコピーして貼るだけで作業が進んでしまい、自分では覚えた気になっているだけで、知識がほとんど残っていないと感じていました。
かといって、本番のブログで自分で考えたSQLを試すと、まちがえたときにブログを壊してしまうおそれがあります。そこで、本番とは別に、練習用のWordPressを作ることにしました。練習用なら、壊しても作り直せば済みます。
このシリーズ「初心者のSQL練習帳」では、練習用のWordPressでお題を出してもらい、ヒントだけを見て自分でSQLを書いていきます。まちがえたSQLやエラーの文も、そのまま載せます。第0回の今回は、その練習用のWordPressを作ったときのことをまとめます。
場面1:どこに作るかを決めた
自宅のサーバーには、このブログのほかに、ポートフォリオと実験用のドメイン(portfoliosoftdev.uk)があります。このドメインには、もともとBasic認証(ユーザー名とパスワードを聞かれる仕組み)をかけてあるので、練習用のWordPressを置いても、ほかの人に見られたり、検索に出たりしません。
| No. | 項目 | 本番のブログ | 練習用 |
|---|---|---|---|
| 1 | URL | https://softdev-learn.cc/ | https://portfoliosoftdev.uk/wp-practice/ |
| 2 | WordPressの置き場所 | /var/www/html | /var/www/app/wp-practice |
| 3 | データベース | wordpress | wp_practice |
| 4 | データベースのユーザー | 本番用のユーザー | wp_practice(練習用のデータベースだけを触れる) |
ファイルもデータベースも完全に分けたので、練習用で何を消しても壊しても、本番のブログには影響しません。
作る前に、置き場所の設定と、本番のファイルの持ち主を確かめました。
sudo grep -rn -A8 '<Directory "*/var/www/app"*>' /etc/httpd/
stat -c '%U:%G %n' /var/www/html /var/www/html/wp-content /var/www/app- grep -rn -A8 ‘…’ /etc/httpd/:
Apacheの設定のファイルを全部探して、/var/www/app の設定の部分と、そのあと8行を出す - stat -c ‘%U:%G %n’ …:
フォルダーの持ち主(ユーザー:グループ)と名前を出す
結果の例:
/etc/httpd/conf.d/portfolio.conf:8: <Directory /var/www/app>
/etc/httpd/conf.d/portfolio.conf-9- AllowOverride All
/etc/httpd/conf.d/portfolio.conf-10- Require all granted
/etc/httpd/conf.d/portfolio.conf-11- </Directory>
root:root /var/www/html
apache:apache /var/www/html/wp-content
apache:apache /var/www/app- AllowOverride All:
フォルダーの中に置いた .htaccess の設定が効く。WordPressの .htaccess(記事のURLを整える書き換えのルール)も使える - 本番の持ち主:
WordPressの本体は root:root、画像やプラグインを入れる wp-content だけが apache:apache。練習用も同じ形にする
場面2:練習用のデータベースとユーザーを作った
練習用のデータベースと、そのデータベースだけを触れるユーザーを作りました。パスワードがコマンドの履歴に残らないように、打ち込む形にしています。
read -s -p "wp_practice のパスワード: " PW; echo
sudo mysql <<SQL
CREATE DATABASE wp_practice CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_practice'@'localhost' IDENTIFIED BY '${PW}';
GRANT ALL PRIVILEGES ON wp_practice.* TO 'wp_practice'@'localhost';
FLUSH PRIVILEGES;
SQL
unset PW- read -s -p “…” PW:
画面に文字を出さずにパスワードを打ち込み、PW という入れ物に入れる - sudo mysql <<SQL 〜 SQL:
間に書いたSQLを、まとめて mysql に渡す。中の ${PW} は、打ち込んだパスワードに置き換わる - CREATE DATABASE wp_practice …:
練習用のデータベースを作る。utf8mb4 は、日本語や絵文字も入れられる文字の形 - CREATE USER ‘wp_practice’@’localhost’ …:
サーバーの中からだけつなげるユーザーを作る - GRANT ALL PRIVILEGES ON wp_practice.* …:
練習用のデータベースの中だけ、何でもできるようにする。本番のデータベースには入れない - unset PW:
使い終わったパスワードを、入れ物から消す
作れたかを確かめました。
sudo mysql -e "SHOW DATABASES LIKE 'wp_practice'; SHOW GRANTS FOR 'wp_practice'@'localhost';"結果の例:
+------------------------+
| Database (wp_practice) |
+------------------------+
| wp_practice |
+------------------------+
+--------------------------------------------------------------------------------------------------------------------+
| Grants for wp_practice@localhost |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `wp_practice`@`localhost` IDENTIFIED BY PASSWORD '*…' |
| GRANT ALL PRIVILEGES ON `wp_practice`.* TO `wp_practice`@`localhost` |
+--------------------------------------------------------------------------------------------------------------------+2つ目の表に「GRANT ALL PRIVILEGES ON wp_practice.*」が出ていれば、練習用のデータベースだけを触れるユーザーになっています。
ここで1つ、まぎらわしかったことがあります。WordPressのテーブルの名前は、wp_posts のように頭に wp_ が付きます(テーブルの接頭辞)。練習用のデータベースの名前を wp_practice にしたので、データベースの名前の wp_ も、接頭辞の wp_ と同じものに見えてしまいました。
| No. | 名前 | 何の名前か |
|---|---|---|
| 1 | wp_practice | データベースの名前(自分で決めた) |
| 2 | wp_posts | データベースの中の、テーブルの名前(wp_ は接頭辞) |
場面3:WordPressを置いた
日本語版のWordPressをダウンロードして置き、持ち主を本番と同じ形にしました。
cd /tmp
curl -LO https://ja.wordpress.org/latest-ja.tar.gz
tar xzf latest-ja.tar.gz
sudo mv wordpress /var/www/app/wp-practice
sudo chown -R root:root /var/www/app/wp-practice
sudo chown -R apache:apache /var/www/app/wp-practice/wp-content
rm latest-ja.tar.gz- curl -LO …:
日本語版の最新のWordPressをダウンロードする - tar xzf …:
ダウンロードしたファイルを展開する。wordpress というフォルダーができる - sudo mv wordpress /var/www/app/wp-practice:
wordpress のフォルダーを、wp-practice という名前で移す - sudo chown -R root:root …:
中身を全部、本番と同じ root:root にする - sudo chown -R apache:apache …/wp-content:
wp-content だけ apache:apache にして、画像やプラグインを入れられるようにする
場面4:インストールの途中で、wp-config.php を手で作った
ブラウザーで https://portfoliosoftdev.uk/wp-practice/ を開くと、Basic認証のあとに、WordPressのインストールの画面が出ました。データベースの名前(wp_practice)、ユーザー名(wp_practice)、パスワード、ホスト名(localhost)、テーブルの接頭辞(本番と同じ wp_)を入れて進めると、「wp-config.php ファイルに書き込めません」と出て、ファイルの中身が表示されました。
本体を root:root にしたので、WordPressが自分でファイルを作れないためです。表示された中身をコピーして、サーバーで自分で作りました。
sudo vi /var/www/app/wp-practice/wp-config.php
sudo chown root:apache /var/www/app/wp-practice/wp-config.php
sudo chmod 640 /var/www/app/wp-practice/wp-config.php- sudo vi …:
vi でファイルを作る。i で入力のモードにして貼り付け、Esc を押してから :wq で保存して閉じる - sudo chown root:apache …:
持ち主を root、グループを apache にする - sudo chmod 640 …:
root は読み書き、apache のグループは読むだけ、ほかのユーザーは読めないようにする。データベースのパスワードが入っているため
ブラウザーに戻ってインストールを進め、サイトの名前と、本番とはちがうログイン名とパスワードを決めました。このとき、「検索エンジンがサイトをインデックスしないようにする」にもチェックを入れておきます。
場面5:翻訳の更新で、FTPの「接続情報」の画面が出た
ログインすると、翻訳の更新が1つありました。更新を押すと、「接続情報」という画面が出て、FTPのホスト名やパスワードを聞かれました。このサーバーでは、FTPは使っていません。
本番のブログも同じ持ち主の形なのに、この画面は出ていませんでした。本番の wp-config.php を調べると、理由が分かりました。
sudo grep -n "FS_METHOD" /var/www/html/wp-config.php /var/www/app/wp-practice/wp-config.php結果の例:
/var/www/html/wp-config.php:125:define('FS_METHOD', 'direct');- FS_METHOD:
WordPressが、ファイルをどうやって書き込むかの設定 - ‘direct’:
FTPを使わず、直接書き込む
本番には、この設定が入っていました。練習用にも同じ行を足します。設定は、WordPressの読み込みが始まる前に書く決まりなので、wp-config.php の「That’s all, stop editing!」の行のすぐ上に入れました。日本語でインストールしたのに、この目印の文は英語のままでした。
sudo grep -n -E "That's all|ABSPATH|wp-settings" /var/www/app/wp-practice/wp-config.php結果の例:
14: * * ABSPATH
94:/* That's all, stop editing! Happy publishing. */
97:if ( ! defined( 'ABSPATH' ) ) {
98: define( 'ABSPATH', __DIR__ . '/' );
102:require_once ABSPATH . 'wp-settings.php';94行目が目印の行です。vi で94行目から開いて、その上に1行足しました。
sudo vi +94 /var/www/app/wp-practice/wp-config.php- +94:
94行目から開く。開いたら O(大文字のオー)で上に行を作り、define(‘FS_METHOD’, ‘direct’); と打って、Esc → :wq で保存する
実は、最初に開いたときに Ctrl+Z を押してしまい、vi が閉じずに「停止」になりました。Windowsの「元に戻す」と同じキーなので、押してしまいやすいです。このときは、fg と打つと vi に戻れます。vi の中で元に戻したいときは、Esc を押してから u です。
入ったかを確かめました。
sudo grep -n -B1 -A1 "FS_METHOD" /var/www/app/wp-practice/wp-config.php結果の例:
93-
94:define('FS_METHOD', 'direct');
95-/* That's all, stop editing! Happy publishing. */これで、翻訳の更新は「接続情報」の画面が出ずに終わりました。
場面6:.htaccess も手で作った
記事のURLを本番と同じ形にするために、「設定」→「パーマリンク」で「投稿名」を選んで保存しました。ここでも本体が root:root なので、WordPressが .htaccess を書けず、書き換えのルールが画面に表示されました。
表示されたルールをコピーして、vi で /var/www/app/wp-practice/.htaccess を作りました。貼り付けたときに行の頭がずれないよう、i を押す前に :set paste と打っておきます。
ブラウザーで https://portfoliosoftdev.uk/wp-practice/hello-world/ を開くと、WordPressに最初から入っている「Hello world!」の記事が出たので、パーマリンクの設定ができました。
場面7:本番の記事を読み込んだら、真っ白で止まった
練習に使う記事として、本番のブログの記事を読み込みました。本番の「ツール」→「エクスポート」で「すべてのコンテンツ」を書き出し、練習用の「ツール」→「インポート」→「WordPress」で読み込みます。本番は書き出すだけなので、何も変わりません。
1回目は、「添付ファイルをダウンロードしてインポートする」にチェックを入れて実行しました。すると、しばらくして画面が真っ白のまま止まりました。
どこまで入ったかを、SQLで数えました。
sudo mysql wp_practice -e "SELECT post_type, post_status, COUNT(*) AS n FROM wp_posts GROUP BY post_type, post_status ORDER BY post_type, post_status;"- GROUP BY post_type, post_status:
種類と状態が同じ行をまとめて、まとめごとに数える - COUNT(*) AS n:
まとめごとの行の数を数えて、n という名前で出す
結果の例:
+---------------+-------------+-----+
| post_type | post_status | n |
+---------------+-------------+-----+
| attachment | inherit | 280 |
| attachment | private | 1 |
| page | draft | 1 |
| page | publish | 1 |
| post | auto-draft | 1 |
| post | publish | 1 |
| wp_navigation | publish | 1 |
+---------------+-------------+-----+画像(attachment)は入っていましたが、記事(post)は最初からある Hello world! の1本だけで、本番の記事は1本も入っていませんでした。画像を本番から1枚ずつダウンロードしている途中で、時間の上限で打ち切られたとみられます。PHPのエラーの記録には、練習用のエラーは出ていませんでした。
そこで、2回目は「添付ファイルをダウンロードしてインポートする」のチェックを外して、同じファイルで読み込み直しました。すでに入った画像は「既に存在します」として飛ばされます。
結果の例:
+------------------+-------------+-----+
| post_type | post_status | n |
+------------------+-------------+-----+
| attachment | inherit | 355 |
| attachment | private | 1 |
| custom_css | publish | 1 |
| nav_menu_item | publish | 10 |
| page | draft | 1 |
| page | publish | 7 |
| page | trash | 2 |
| post | auto-draft | 1 |
| post | draft | 93 |
| post | future | 11 |
| post | private | 2 |
| post | publish | 173 |
| post | trash | 34 |
| wp_block | publish | 1 |
| wp_block | trash | 2 |
| wp_global_styles | publish | 2 |
| wp_navigation | publish | 2 |
+------------------+-------------+-----+今度は、公開中の記事173本、下書き93本、予約中11本などが入りました。これで、練習用のWordPressの準備ができました。
まとめ
本番のブログを壊さずにSQLを練習するために、Basic認証の中に、別のデータベースで練習用のWordPressを作りました。WordPressの本体を本番と同じ root:root にしたので、wp-config.php と .htaccess は手で作り、FTPの画面が出ないように FS_METHOD を足しました。本番の記事を読み込むときは、画像のダウンロードで時間切れになったので、画像なしで入れ直しました。
次の第1回からは、この練習用のWordPressで、お題に合わせて自分でSQLを書いていきます。
このシリーズで使うSQLの部品の意味は、データベースのコマンドの記事でも説明しています。SQLで記事を触ると何が起きるかは、SQLで下書きに戻したら空のカテゴリーが残った記事にまとめています。



コメント