【mySQL/WordPress】SQLのUPDATEやDELETE・INSERTを直接打って、WordPressの記事をデータベースから操作してみる
| 更新: 2025/01/10 | 2677文字
今回は、(管理画面からやればいいので)ぶっちゃけ役にたたないかもしれないんですけど、『直接SQLのUPDATEやDELETE・INSERTを打って、WordPressの記事をデータベースから操作』という内容を取り上げます。人によってはデータベースの理解につながるかもしれません。早速見ていきましょう。
目次
やってみた経緯~管理人のtwitterつぶやきの続き
やってみた経緯なんですけど、管理人は以前twitterで『UPDATEのSQLを直接書いてWordPress更新した』みたいなことを書いたことがありました。このときはUPDATEしか使ってなかったんですが、あとから思い出して、『他の操作もまとめて、コラムの記事にしよう』となったわけです。
普通は管理画面から更新すると思うんだけど、興味関心とか、あえて、という感じです。
WordPressの記事をデータベースから操作~もともとある記事に対してUPDATEやDELETE
まずは、もともとある記事に対して、SQLでUPDATEやDELETEというのをやってみます。 管理人のテスト用WPに入っていた、この記事(ID=4549番)を題材にします。元の状態はpost_content(本文)に、『カテゴリ3テスト記事が入ります』という文章が繰り返しはいっているだけ。
phpmyadmin上で直接SQLのUPDATE
とりあえず適当にphpmyadminに入って(直接SQLを打てる)、SQLタブからUPDATEを実行します。既存記事のUPDATEやDELETEは、WHERE句でID指定すればよいので、難易度は高くありません。実行したSQLは以下の通り。
SET post_content = 'sqlで更新したよ。sqlで更新したよ。sqlで更新したよ。sqlで更新したよ。'
WHERE ID =4549;
実行後、ID =4549の記事の本文が更新されていることを確認しました。あと上記のSQLは、オラクルとか使っている人には言わないでください(笑)『commit書かねえの?』って言われるからね。
(注:mysqlのデフォルト設定はオートコミットがon。ロールバック使いたいときはoffにするかも。)
ということは、フロントで見ても更新されている状態で、大丈夫ですね~。
phpmyadmin上で直接SQLのDELETE
次は、DELETEを実行してみましょうか。基本はUPDATEのとき同様に、WHERE句でIDを指定して行います。管理人はやったことないんですけど、WHERE句で条件指定しないと、全部消えるらしいです。注意しましょう。以下のSQLを実行。
WHERE ID = 4549;
管理画面でid指定してアクセスしようとしても『削除されたのかもしれません』と出てきます。消えましたね。
ちょっと難易度が高いかもしれない、新規の記事INSERT
難易度が高い理由~カテゴリが別テーブルや、カラムが多くて型やデフォルト値を押さえる必要がある
次は新規の記事INSERTをやってみますが、これはUPDATE/DELETEより難易度が高いです。
その一つがカテゴリ。カテゴリはWPのテーブル設計上、wp_postsに入っていません。 『wp_term_relationships』で、投稿idと同じ数値のobject_idの列に、『term_taxonomy_id』という形で入っています。で、この値が54のとき・・・
管理人環境でいうと、『tag_id=54,カテゴリ名:カテゴリ2,スラッグ:cat2のカテゴリが設定されている』という流れです。 やる場合はjoinとか結合させる感じでしょうか。または2回実行とか(1回目wp_posts、idを取ってきて2回目にwp_term_relationships)。 今回はここまで行いませんけど。
そのほか、idはオートインクリメントだから自動で入るにしても・・・ 単純にカラムが多くて、デフォルト値や型もバラバラです。きちんとやる場合は、ここを押さえてからやるとベターです。
簡単にINSERTしてみた例~デフォルト値のせいで日付がおかしい&カテゴリが空
あんまりきちんとやると長くなるんで、3つの項目を使って(auto_incrementのid入れれば4つ)、新規の記事をSQLでINSERTしてみますか。post_author/post_content/post_titleに対して、SQLのvaluesで値を割り当てます。実行したのは以下。
values (1, '本文入ります。本文入ります。本文入ります。','SQLからタイトル入れます');
一応新しい記事は入ったんですけど、デフォルト値のせいで日付がおかしいです(笑)日付の型はdatetime型なので、mysqlのCURRENT_TIMESTAMP(現在の日時)が使えそう。また、カテゴリは指定していないので、もちろん空です。
カテゴリ・タクソノミが無い投稿タイプの場合は問題ないかもしれませんが、この場合はINSERT時にそのpost_typeの指定を忘れないようにします。
あとがき・まとめ
- WordPressでは、管理画面からのほか、データベースから直接SQLを打っても操作できる
- UPDATEやDELETEは、WHERE句でidを指定すればいいので難易度は高くない
- INSERTはカテゴリが別テーブルかつ、カラムが多くて型や初期値もバラバラなので、きちんとやると難易度が高い
まとめると、こんなところでしょうか。管理人は楽しめたんですけど、『めんどくせー』って思った場合は、そのまま管理画面から更新しましょう。
【カテゴリ】- WordPressファンクションetc
【タグ】- WordPress, データベース