現在、個人的に作っているサイトがあります。そのサイトはWordPressで作っています。情報が多いので、カスタムフィールドを使っています。
今作っているサイトの情報は日々変わるようのが当たり前なので、プログラムを使って更新しないといけません。手動での更新では時間がいくらあっても足りません。
今回紹介するのは、WordPressの裏側で動いているMySQL(データベース)に格納されている、カスタムフィールドの値をプログラムコードを書いて更新する方法です。
このページの目次
データベース上のカスタムフィールド
プログラムでカスタムフィールドを更新するには、データベースの仕組みを理解していないといけません。
WordPressのデータベースについての仕組みはこの記事が非常に参考になります。
【WordPressのデータベース(DB)を操作したいので初めの一歩から勉強して理解しています】 | 今村だけがよくわかるブログ
カスタムフィールドはどのような形でデータベースに保持されているのか・・・。今回したいことをきっかけに初めてデータベースをじっくり見ました。
カスタムフィールドが格納されているテーブル「wp_postmeta」を見てみましょう。
フィールドは4つ。主キーは「meta_id」です。「post_id」が記事や画像ファイルを追加した時に付与される番号のことです。よく見かける「http://hogehoge.com?p=1」というような「p=1」の「1」の部分が「post_id」です。
「meta_key」はカスタムフィールド名で「meta_value」がカスタムフィールドに格納された値のことです。
テーブルのレコードには以下のような感じで保存されます。
meta_id | post_id | meta_key | meta_value |
---|---|---|---|
1 | 1 | hoge1 | おはようございます |
2 | 1 | hoge2 | こんにちは |
3 | 1 | hoge3 | おやすみなさい |
4 | 2 | hoge1 | Good Morning |
5 | 2 | hoge2 | Hello |
6 | 2 | hoge3 | Good Night |
このデータをこれから使っていきましょう。
カスタムフィールドをピンポイントで更新する
これからが本題ですね。カスタムフィールドを更新する方法です。ここでは3行目の「meta_value」を「こんばんは」に書き換えると仮定して進めていきます。更新する側はもともと「おやすみなさい」が入っていることを知らないとして話を進めます。
まずは、コードを紹介しましょう。
$meta_id = $wpdb->get_var(" SELECT meta_id FROM ".$wpdb->postmeta." WHERE meta_key = 'hoge3' AND post_id = 1");<br /><br />$wpdb->query(" UPDATE ".$wpdb->postmeta." SET meta_value = 'こんばんは' WHERE meta_id = ".$meta_id);
SQL文を見やすくするため改行しました。改行しなければ、2行で書けるコードです。
最初の5行で「post_id」が”1″で「meta_key」が”hoge3″の主キー「meta_id」を取得しています。
そして次の4行で、上の5行で取得した「meta_id」をキーにして「meta_value」に”こんばんは”をセットしています。
$wpdbという変数はグローバル変数で、これを使うと簡単にデータベースを操作できます。詳しくは先ほど紹介した記事を参考にしてください。
【WordPressのデータベース(DB)を操作したいので初めの一歩から勉強して理解しています】 | 今村だけがよくわかるブログ
普通にphpを書いてて、データベースを扱おうとすると結構大変なのですが、WordPress便利ですね〜。
get_var関数はSQLの結果を1つだけ返したい時に便利な関数です。詳細はこちら。
下4行の中にあるquery関数はSQL文を実行する関数です。ダブルクォーテーション(“”)で囲っているのはSQL文です。
たったこれだけのコードでカスタムフィールドの値を更新できるなんて便利ですね。一から作ってたら、これだけ簡単なコードだけで動くようにするための仕組みを作るのがものすごく大変です。
このコード、もう少し簡略化しようと思えばできます。ちょっと見にくくなるので、載せるのはやめておきます。
もし、プログラムでカスタムフィールドを更新する機会があれば、ぜひ使ってみてください。
2013/5/1 追記:
後日、Twitterで私の間違いを指摘していただきました。
@peter0906 拝見しましたー♪ ちょっと気になったのですが、何故カスタムフィールドのAPIを使っていないのでしょうか? あとこの方法だと意図しないフィールドが更新される可能性もありそうな感じも…? (*’-‘*)
— yuka2py (=゚ω゚)ノさん (@yuka2py) 2013年5月1日
カスタムフィールドの値を取得する関数があることを忘れていました。get_post_metaとか今まで普通に使ってたのに^^; update_post_metaは今回初めて知りました。
@peter0906 ありますよー。get_post_meta とか、update_post_meta とか。update_post_meta を見てもらうと分かると思うのですが、WPのスキーマでは post_id + meta_key はユニークとは限らない仕様になりますよー。 — yuka2py (=゚ω゚)ノさん (@yuka2py) 2013年5月1日
update_post_metaを使うことで、上記のコードはたったの1行で済ますことができました。WordPressすごい!
update_post_meta('1', 'hoge3', 'こんばんは');
update_post_metaの使い方はcodexに書いてありますので、そちらを参考にしてください。
@yuka2pyさん、ありがとうございました!
@yuka2pyさんの会社はこちらです。技術力が高く、人柄も素敵な方です。同じ区に住んでいるので、親近感を持っています。
Foreignkey, Inc. | 神戸のWeb制作とシステム開発会社。スマートフォンWebやネイティブアプリケーション開発、WordPress構築を中心に幅広く対応。