かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Wordpress Contact Form 7 GETで値を渡してselectを選択する方法。

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を記述しないとシンタックスハイライトしてくれないっぽいのですね。。。