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;