fbpx

メニュー

wpdb道場 (2) 〜データの作成・更新・削除〜

高橋文樹 高橋文樹

この投稿は 9年半 前に公開されました。いまではもう無効になった内容を含んでいるかもしれないことをご了承ください。

さて、前回は$wpdbを使ってSELECTなんちゃらというクエリを発行し、WordPressのデータを取得してみました。ある意味、あなたはMySQLの持つ4つの側面のうち一つを学んだということになります。

はて、4つとはなんでしょう。実はRDBMS(MySQLのようなリレーショナルデータベース管理システム)には、CRUDという言葉があります。

  1. 作成 (Create)
  2. 取得 (Retrieve)
  3. 更新 (Update)
  4. 削除 (Delete)

あなたが前回やったSELECTなんちゃらはこのうちのR(取得)に当たります。僕個人の感覚では、CRUDに割く労力は次のような感じです。

Create 10%
Retrieve 80%
Update 8%
Delete 2%

要するに、うんうん悩むのは取得の部分で、他はそんなに難しくないんですね。もちろん、バッチ処理でDeleteかけたらやたら遅くて1日たっても終わらないとかそういう苦労もあるにはあるのですが、やはり取得が一番悩みどころです。

逆に考えると、CUDに関してはちゃちゃっと終わらせてしまい、Rに割く労力を確保した方がいいですね。

では、早速やってみましょう。前回作ったwpdb-test.phpに追記していく形にします。本当はサンプルサイトをインストールしてどうこうとか考えていたんですが、若干酔っ払っていて辛いので。

1. データを追加してみよう

それでは、データを追加してみます。まず、どうでもいい投稿を1つ選び、その投稿のIDを突き止めてください。僕はとりあえずローカルにインストールされているWordPressの投稿を選んでみました。投稿IDは13640ですね。

投稿一覧でマウスオーバーするとIDが見える
投稿一覧でマウスオーバーするとIDが見える

それでは、この投稿にカスタムフィールドを追加してみましょう。カスタムフィールドはwp_postmetaというテーブルに保存されています。

wp_postmetaの構造

カスタムフィールドは重複を許すので、同じようなデータを追加できます。今回はmy_wpdbというキーで、「できた!」という値を追加してみましょう。

// カスタムフィールドを追加
// 前回やった通り、$wpdbにはデフォルトのテーブルが
// メンバー変数としてアサインされてます。
$result = $wpdb->insert( $wpdb->postmeta, array(
     'post_id' => 13640,
     'meta_key' => 'my_wpdb',
     'meta_value' => 'できた!',
), array('%d', '%s', '%s',) );
// 返り値を表示してみる
var_dump($result);

多分、画面には1と表示されたかと思います。

この1は何かというと、変更された行ですね。1行追加されたので1と返ってきているわけです。裏を返せば、データの作成に失敗すると0が返ってくるということですね。

さて、結果を見るために該当する投稿の編集画面を開いてみましょう。そうすると、カスタムフィールドに値が追加されているのがわかります。

保存されたカスタムフィールド

では、wpdb-test.phpを4回ぐらいリロードしてみてください。そうすると、カスタムフィールドがずらっと増えています。

リロードの回数だけカスタムフィールドが増える

insertメソッドは引数として、テーブル名、カラムと保存する値からなる配列、サニタイズ用の配列を取ります。二番目の配列はテーブル構造を照らし合わせてみると、「ああ、そういうことね」というのがわかりますね。無害化サニタイズ用の配列については、明日以降で説明するので、「そういうものがあるのだな」程度に思っていてください。

2. 投稿を更新

それでは、CRUDの3つ目、更新をやってみましょう。先ほどの投稿IDのタイトルを変更してみます。

// 投稿を更新
$result = $wpdb->update( $wpdb->posts, array(
     'post_title' => '更新されちゃった!',
), array(
     'ID' => 13640,
), array('%s'), array('%d') );

wpdb-test.phpを開いてみると、タイトルが変わっているのがわかるかと思います。

スクリーンショット 2014-12-10 1.17.54

どうでしょう、このupdateメソッドって、insertメソッドと似ていませんか? そうなんです。対して変わらないんですよ。

3. カスタムフィールドを削除

さて、先ほど追加したmy_wpdbというカスタムフィールドなのですが、特に使い道がないので削除してしまいましょう。

// どうでもいいカスタムフィールドを削除
$wpdb->delete( $wpdb->postmeta, array(
     'meta_key' => 'my_wpdb',
), array('%s'));

どうでしょう、投稿編集画面のカスタムフィールドから、さきほど追加した値が全部消えたんじゃないでしょうか。

まとめ

  • MySQLのようなデータベースにはCRUDという概念があり、あなたはそれを一通り試した

さて、一通りの機能はやってみましたが、まだまだ。バスケットボールで言えば、バッシュの履き方を覚えたようなものです。

次回はWordPressのテーブル構造を見ながら、目的とする機能を実現するためのデータベース構造設計を試みます。

すべての投稿を見る

高橋文樹ニュースレター

高橋文樹が最近の活動報告、サイトでパブリックにできない情報などをお伝えするメーリングリストです。 滅多に送りませんので、ぜひご登録お願いいたします。 お得なダウンロードコンテンツなども計画中です。