Contact Form 7にGETなどで値を渡して
テキストフィールドに値を渡す方法は検索すると結構で出来ます。
フロントエンドでゴニョゴニョやっても良いのですが、wpcf7_form_tag
フィルターを使えば実装できるようです。(jsの方が得意なのでフロントエンドでやったらええやんとも思ってしまうのですが、勉強も兼ねて。)
[参考] どや!?Contact form 7 のフォームに自動的に記事タイトルを入れる方法 | デザインどや!?
<?php // function.php function my_contact_form_filter($tag) { $formName = 'your-name'; if( !is_array($tag) ) { return $tag; } if( isset($GET_[$formName]) ) { $name = $tag['name']; if( $name === $formName ) { $tag['values'] = (array) $_GET[$formName]; } } return $tag; } add_filter( 'wpcf7_form_tag', 'my_contact_form_filter', 11);
検索してもselectを選択する方法が見つからなかったので調べて実装してみました。
Contact Form 7でselectを作る時にdefault:(num)
を設定すると(num)
の部分の番号のoption(先頭は0でなくて1)がデフォルトでselectedになるようです。
なので、
default:
をフィルターで設定してやれば最初から選択した状態になるはず。なのです!
同じようにfunction.phpに記述します。
<?php // function.php /** * Replace Contact Form 7 form tag * @param: $tag (Array) ... フォームタグを生成するオブジェクト * @param: $replace (Bool) ... true: wpcf7_form_tag フィルターで呼び出された時 * ref: includes/form-tags-manager.php 319: apply_filters( 'wpcf7_form_tag', $scanned_tag, $replace ); */ function my_contact_form_filter($tag, $replace) { $formName = 'your-select'; if( !is_array($tag) || !$replace ) { return $tag; } if( isset($GET_[$formName]) ) { $name = $tag['name']; if( $name === $formName ) { $value = $GET_[$formName]; // optionsの中から選択する項目を探す if( is_array( $tag['values'] ) ) { $index = array_search($value, $tag['values']); if( $index !== false ) { // default: オプションの先頭は1なので+1する $index++; $defaultOption = 'default:' . $index; // selectタグにoptionsがあるか調べる if( !is_array($tag['options']) ) { // optionsがなければ作って default:オプションを追加 $tag['options'] = array($defaultOption); } else { // optionsの中に既に default:オプションが有るか調べる $is_defaultOption = false; foreach( $tag['options'] as $key => $value ) { if( substr_compare($value, 'default', 0, 7) === 0 ) { $is_defaultOption = true; break; } } if( $is_defaultOption ) { // defaultオプションを上書き $tag['options'][$key] = $defaultOption; } else { // defaultオプションを追加 array_push($tag['options'], $defaultOption); } } } } } } return $tag; } add_filter( 'wpcf7_form_tag', 'my_contact_form_filter', 11, 2);
なんだかすごく冗長なコードが出来上がってしまった...
まぁこれでGETで渡した値を元にContact Form 7のselectを予め選択させることが出来ました。
調べてて、phpのif else 分は else の方が処理が速いらしいので、
予想されるケースが多い方をelseに書いた方が良いそうです。
後、配列の指定は
$array[foo]
より
$array['foo']
の方が高速らしいって事を知りました。
PHPは最近全然触ってなかったのでどんどん忘れています!老化!
そして。はてなのスーパーpre記法でPHPを書くときは先頭に<?php
を記述しないとシンタックスハイライトしてくれないっぽいのですね。。。