WordPressのお問い合わせフォームのプラグイン「Contact Form 7」から、現在登録されているメールアドレス等のデータを取得したいことがあると思います。
通常の投稿やカスタムポストであれば、wp_queryで取得できますが、Contact Form 7のデータはやや特殊な形式でデータベースに入っていますので、直接、WordPressのDBにアクセスしてデータを抜き出してくるのが手っ取り早いです。
コンタクトフォームの取得
まずは、コンタクトフォームを取得します。コンタクトフォームもカスタムポストタイプの一つですので、wp_postsテーブルからpost_typeを指定してコンタクトフォームだけ抽出し、そのpost_idを取得します。
global $wpdb;
// wp_post テーブルから post_type: wpcf7_contact_form だけ抽出
$sql = "SELECT * FROM wp_posts WHERE post_type = 'wpcf7_contact_form'";
$results = $wpdb->get_results($sql);
foreach ($results as $result) {
$post_id = $result->ID;
...
}
コンタクトフォームの項目データの取得
コンタクトフォームのデータは、wp_postmetaテーブルに入っていますが、wp_postmetaテーブルのカラムは次のような構造になっています。
【wp_postmetaのテーブルカラム構造】
| ID | 関連するpostのID | キー | 値 |
|---|---|---|---|
| meta_id | post_id | meta_key | meta_value |
コンタクトフォームの設定画面には「フォーム」「メール」「メッセージ」「その他の設定」というタブがありますが、それぞれ次のキーが使われています。
| 内容 | meta_key |
|---|---|
| 「フォーム」タブの項目 | _form |
| 「メール」タブの「メール」の項目 | _mail |
| 「メール」タブの「メール (2)」の項目 | _mail2 |
| 「メッセージ」タブの項目 | _messages |
| 「その他の設定」タブの項目 | _additional_settings |
登録されているメールアドレスの情報を取得する場合は、「meta_key: _mail」の情報を取得すれば良いです。
取得したmeta_valueは、シリアライズ化されたデータ(a:1:{s:6:”active”;})となっていますので、デシリアライズして、変数 $wpcf7_data_mail に代入します。
メールアドレスが入っているのは「recipient」キーであり、$wpcf7_data_mail[‘recipient’] で取り出せます。
あとはそれぞれの目的に応じて自由にデータを利用すれば良いですが、とりあえず、ここでは全てのキーと値を画面に表示してみます。
foreach ($results as $result) {
$post_id = $result->ID;
// wp_postmeta テーブルから $post_idに該当し、かつ、meta_key: _mail の行を抽出
$sql = "SELECT * FROM wp_postmeta WHERE post_id = $post_id AND meta_key = '_mail'";
$results2 = $wpdb->get_results($sql);
foreach ($results2 as $result2) {
$meta_value = $result2->meta_value;
// 値をデシリアライズ
$wpcf7_data_mail = unserialize($meta_value);
// 以下では、とりあえず画面にキーと値をCSV形式で表示する。
// 1行目にキー情報表示
if (!$cnt) {
$str .= 'post_title';
foreach ($wpcf7_data_mail as $key => $value) {
$str .= ',' . $key;
}
$str .= "<br>\n";
}
// 各カラムの値を表示
$str .= $post_title;
foreach ($wpcf7_data_mail as $key => $value) {
$str .= ',' . '"' . $value . '"';
}
break;
}
$str .= "<br>\n";
$cnt++;
}
echo $str;
他のタブの項目データを取得するには、meta_keyに別のキーを指定して取得すれば良いです。
まとめ
コードをすべて合わせておきます。
<?php
global $wpdb;
// wp_post テーブルから post_type: wpcf7_contact_form だけ抽出
$sql = "SELECT * FROM wp_posts WHERE post_type = 'wpcf7_contact_form'";
$results = $wpdb->get_results($sql);
foreach ($results as $result) {
$post_id = $result->ID;
// wp_postmeta テーブルから $post_idに該当し、かつ、meta_key: _mail の行を抽出
$sql = "SELECT * FROM wp_postmeta WHERE post_id = $post_id AND meta_key = '_mail'";
$results2 = $wpdb->get_results($sql);
foreach ($results2 as $result2) {
$meta_value = $result2->meta_value;
// 値をデシリアライズ
$wpcf7_data_mail = unserialize($meta_value);
// 以下では、とりあえず画面にキーと値を表示する。
// 1行目にキー情報表示
if (!$cnt) {
$str .= 'post_title';
foreach ($wpcf7_data_mail as $key => $value) {
$str .= ',' . $key;
}
$str .= "<br>\n";
}
// 各カラムの値を表示
$str .= $post_title;
foreach ($wpcf7_data_mail as $key => $value) {
$str .= ',' . '"' . $value . '"';
}
break;
}
$str .= "<br>\n";
$cnt++;
}
echo $str;


