[PR] 本記事にはプロモーションが含まれています。

【WordPress】初心者のSQL練習帳 第0回:本番とは別に、練習用のWordPressを作った|FTPの画面とインポートの真っ白で止まった

本番のブログとは別に、練習用のブログとデータベースを用意した様子を表したイラスト WordPress

【2026年10月20日時点の情報です】

このブログの運営では、AI(Claude)に相談しながら、データベースのコマンドをたくさん流してきました。ただ、出してもらったコマンドをコピーして貼るだけで作業が進んでしまい、自分では覚えた気になっているだけで、知識がほとんど残っていないと感じていました。

かといって、本番のブログで自分で考えたSQLを試すと、まちがえたときにブログを壊してしまうおそれがあります。そこで、本番とは別に、練習用のWordPressを作ることにしました。練習用なら、壊しても作り直せば済みます。

このシリーズ「初心者のSQL練習帳」では、練習用のWordPressでお題を出してもらい、ヒントだけを見て自分でSQLを書いていきます。まちがえたSQLやエラーの文も、そのまま載せます。第0回の今回は、その練習用のWordPressを作ったときのことをまとめます。

場面1:どこに作るかを決めた

自宅のサーバーには、このブログのほかに、ポートフォリオと実験用のドメイン(portfoliosoftdev.uk)があります。このドメインには、もともとBasic認証(ユーザー名とパスワードを聞かれる仕組み)をかけてあるので、練習用のWordPressを置いても、ほかの人に見られたり、検索に出たりしません。

No.項目本番のブログ練習用
1URLhttps://softdev-learn.cc/https://portfoliosoftdev.uk/wp-practice/
2WordPressの置き場所/var/www/html/var/www/app/wp-practice
3データベースwordpresswp_practice
4データベースのユーザー本番用のユーザーwp_practice(練習用のデータベースだけを触れる)

ファイルもデータベースも完全に分けたので、練習用で何を消しても壊しても、本番のブログには影響しません。

作る前に、置き場所の設定と、本番のファイルの持ち主を確かめました。

Bash
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’ …:
    フォルダーの持ち主(ユーザー:グループ)と名前を出す

結果の例:

Plaintext
/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:練習用のデータベースとユーザーを作った

練習用のデータベースと、そのデータベースだけを触れるユーザーを作りました。パスワードがコマンドの履歴に残らないように、打ち込む形にしています。

Bash
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:
    使い終わったパスワードを、入れ物から消す

作れたかを確かめました。

Bash
sudo mysql -e "SHOW DATABASES LIKE 'wp_practice'; SHOW GRANTS FOR 'wp_practice'@'localhost';"

結果の例:

Plaintext
+------------------------+
| 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.名前何の名前か
1wp_practiceデータベースの名前(自分で決めた)
2wp_postsデータベースの中の、テーブルの名前(wp_ は接頭辞)

場面3:WordPressを置いた

日本語版のWordPressをダウンロードして置き、持ち主を本番と同じ形にしました。

Bash
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が自分でファイルを作れないためです。表示された中身をコピーして、サーバーで自分で作りました。

Bash
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 を調べると、理由が分かりました。

Bash
sudo grep -n "FS_METHOD" /var/www/html/wp-config.php /var/www/app/wp-practice/wp-config.php

結果の例:

Plaintext
/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!」の行のすぐ上に入れました。日本語でインストールしたのに、この目印の文は英語のままでした。

Bash
sudo grep -n -E "That's all|ABSPATH|wp-settings" /var/www/app/wp-practice/wp-config.php

結果の例:

Plaintext
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行足しました。

Bash
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 です。

入ったかを確かめました。

Bash
sudo grep -n -B1 -A1 "FS_METHOD" /var/www/app/wp-practice/wp-config.php

結果の例:

Plaintext
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で数えました。

Bash
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 という名前で出す

結果の例:

Plaintext
+---------------+-------------+-----+
| 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回目は「添付ファイルをダウンロードしてインポートする」のチェックを外して、同じファイルで読み込み直しました。すでに入った画像は「既に存在します」として飛ばされます。

結果の例:

Plaintext
+------------------+-------------+-----+
| 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で下書きに戻したら空のカテゴリーが残った記事にまとめています。

ほかの開発・プログラミングの記事は、開発・プログラミングメモの目次から、テーマ別に探せます。

このブログは、にほんブログ村と人気ブログランキングに参加しています。記事が役に立ったら、下のランキングのバナーのどれかを押して応援してもらえると励みになります。

ブログランキング・にほんブログ村へにほんブログ村

サーバー構築・運用ランキング プログラムランキング

WordPress
watasoftdevをフォローする

コメント