Wordpressで会員制サイトを構築してみよう（Contact Form 7との連携）


会員ユーザーが問い合わせフォームを利用する際、ユーザー情報を自動で追加することができます。Contact Form 7を利用し、これらを実装してみます。

##元記事
下記エントリの転載になります。
[WordPressで会員制サイトを構築してみよう（Contact Form 7との連携）](http://www.rokurofire.info/2014/10/09/wp_membership6/)


##利用プラグイン
* **[Contact Form 7](https://wordpress.org/plugins/contact-form-7/)**<br>問い合わせフォーム管理プラグイン（バージョン 3.9.3 で試しています）

##実装方法について
今回は、下記の２種類の方法を試しました。

* **（方法1）ユーザー情報を自動でフォームに入力**<br>→　問い合わせページにアクセスした時に、既に入力済みの状態にします

* **（方法2）ポスト時にユーザー情報を追加**<br>→　フォームは最低限の項目だけにし、ポストされた後に情報を追加します

##（方法1）ユーザー情報を自動でフォームに入力

###問い合わせフォームを作る
管理画面「お問い合わせ」で、フォームを作成します。

```CF7
<p>姓 (必須)<br />
    [text* last_name default:user_last_name] </p>

<p>名 (必須)<br />
    [text* first_name default:user_first_name] </p>

<p>メールアドレス (必須)<br />
    [email* user_email default:user_email] </p>

<p>郵便番号 (必須)<br />
    [text user_zip] </p>

<p>都道府県<br />
[select user_prefecture include_blank "北海道" "青森県" ・・・省略・・・"鹿児島県" "沖縄県"]

<p>住所番地等<br />
    [text user_address] </p>

<p>問い合わせ内容<br />
    [textarea your-message] </p>

<p>[submit "送信"]</p>
```

（参考）[ログインユーザーのためにデフォルト値を設定する | Contact Form 7 [日本語]](http://contactform7.com/ja/setting-default-values-to-the-logged-in-user/)

上記参考ページにあるように、いくつかの項目は、「default:」パラメータを付ければそれだけで自動入力されます。
今回は、姓、名、メールアドレスは、CF7の機能でデフォルト値を入力しています。

![register7-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/219c4033-2180-aeb0-268e-ac39682c24fb.jpeg "register7-1.jpg")


###functions.phpに処理を追加

では、上記以外の項目（郵便番号、都道府県、住所番地等）を自動入力させてみます。
CF7の wpcf7_form_tag フィルタを利用します。

```functions.php
function wpcf7_form_tag_filter($tag){
	if(is_admin() || !is_array($tag)) return $tag;

	$name = $tag['name'];

	$user = wp_get_current_user();
	if($user) {
		if($name == 'user_zip') { $tag['values'] = (array) $user->user_zip; }
		if($name == 'user_prefecture') {
			$labels = array("北海道", "青森県",・・・省略・・・"鹿児島県", "沖縄県");
			$index = array_search($user->user_prefecture, $labels);
			$index++;	// カウントは1からなので+1
			$index++;	// blank を設定してあるので+1
			$tag['options'][1] = 'default:' . $index;
		}
		if($name == 'user_address') { $tag['values'] = (array) $user->user_address; }
	}
	return $tag;
}
add_filter('wpcf7_form_tag', 'wpcf7_form_tag_filter', 11);
```

$tag['name'] がユーザーのパラメータと同じ場合、$tag['values']にそのユーザーの登録情報を代入しています。

selectboxの時には少し注意が必要で、インデックスのカウントが0からではなく1からになっています。
また、CF7のフォーム設定で "include_blank" を指定してあるため、配列のインデックスを計+2しています。

これでフォームにユーザー情報が追加されると思います。

##（方法2）ポスト時にユーザー情報を追加
登録されているユーザー情報を、フォームに入力させるのではなく、ポストされたデータに追加してみます。

###問い合わせフォームを作る
```
<p>問い合わせ内容<br />
    [textarea your-message] </p>

<p>[submit "送信"]</p>
```

ユーザー情報はポストしませんので、これだけになります。

![register7-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/3377ad82-7104-6731-52d0-48aea59159da.jpeg "register7-2.jpg")

###functions.phpに処理を追加

wpcf7_posted_data フィルタを利用し、CF7でメールを送信する前にデータを追加することが出来ます。

```functions.php

function wpcf7_my_posted_data($posted_data) {
	$user = wp_get_current_user();
	if(!$user) return $posted_data;

	$posted_data['last_name'] = $user->last_name;
	$posted_data['first_name'] = $user->first_name;
	$posted_data['user_email'] = $user->user_email;
	$posted_data['user_zip'] = $user->user_zip;
	$posted_data['user_prefecture'] = $user->user_prefecture;
	$posted_data['user_address'] = $user->user_address;
	
	return $posted_data;
}
add_filter('wpcf7_posted_data', 'wpcf7_my_posted_data');
```

どちらの方法を使うかは状況によりますが、ポスト時にユーザー情報を追加する方法のほうがよりシンプルで管理が楽かもしれません。

##参考
* [ログインユーザーのためにデフォルト値を設定する | Contact Form 7 [日本語]](http://contactform7.com/ja/setting-default-values-to-the-logged-in-user/)
* [Wordpress Contact Form 7 GETで値を渡してselectを選択する方法。](http://chaika.hatenablog.com/entry/2014/07/13/184925)
* [どや！？Contact form 7 のフォームに自動的に記事タイトルを入れる方法](http://www.doya-doya.com/diary/2010/10/04/2806)