WordPressを導入しているサイトで、以下のことをやりたかったのですが、良い方法が思い浮かばず、結局既存のプラグインに手を加えてしまったお話
やりたかったこと
- 複数の設問を備えたアンケートの入力
- アンケートのお礼に何らかの重複しないギフトコードを表示する
以下、色々がんばっちゃっているのですが、もっと素敵な方法があったら教えてほしい。。
アンケートの入力フォームプラグイン
有名所だとWP-Pollsがあるのですが、複数の設問に対応していなさそうだったので断念。
その後、カスタマイズ性の高い、MW WP Formを発見。
ショートコードを使って、かなり自由度の高い設問を備えたフォームが作成できる。
フィルターフックやアクションフックも多数そろえており、
これならやりたいことができるかもっ!
とマニュアルをみたり、コードを書いてみたりしたもののやっぱりできない。
ということで、MW WP Formのソースを解析していじることに。
MW WP Formの修正
実現方法の構成を以下のようにする
1.アンケート入力フォームにhiddenフィールドを設ける
2.このhiddenフィールドに、UUIDを埋め込む
3.アンケート入力後の確認画面で埋め込んだUUIDを表示する
hiddenフィールドを使いたくはなかったけれど、MW WP Formの構造を変えないでやるには手軽だったので。
以下で詳細を記述します。
1.アンケート入力フォームにhiddenフィールドを設ける
MW WP Formの標準のショートコードを用いて、MW WP Formに以下を入力する
[mwform_hidden name="hoge" value=""]
これで、出力されるフォームにhiddenフィールドが追加される。
なお、hogeを有効にするためには、MW WP Formのフォーム入力画面の管理者メール設定の本文に
{hoge}
を追加しておく必要があります。
また、合わせて、設定の「問い合わせデータをデータベース」にもチェックをいれておく。
2.このhiddenフィールドに、UUIDを埋め込む
このvalueにUUIDを埋め込むため、MW WP Formでサポートしているフィルターを使う
/**
* @param string $content
* @return string
*/
function my_mwform_post_content( $content ) {
$uuid = uniqid();
$hoge = 'name="hoge" value="'.$uuid.'"';
$content = str_replace('name="hoge" value=""',$presentCode,$content);
return $content;
}
add_filter( 'mwform_post_content_mw-wp-form-XXX', 'my_mwform_post_content' );
※mwform_post_content_mw-wp-form-XXXのXXXには、MW WP Formのフォーム識別子に置き換える
これで、以下のようにhiddenフィールドのvalueにUUIDが埋め込まれる
<p><input type="hidden" name="hoge" value="57aeb0c1c23fb" /></p>
3.アンケート入力後の確認画面で埋め込んだUUIDを表示する
これに相当する機能が見当たらずMW WP Formを修正
確認画面の表示直前のフィルターを新規追加する
MW WP Formの以下のコードに修正する。
wp-content/plugins/mw-wp-form/classes/services/class.exec-shortcode.php
関数 mwform_complete_message() を修正する
/**
* 完了後のメッセージ
*
* @param array $attributes
* @return string html
*/
public function mwform_complete_message( $attributes, $content = '' ) {
/*以下の1行を追加*/
$content = apply_filters('mwform_before_completemessage', $content,$this->Data->gets());
$form_key = $this->get( 'key' );
return sprintf(
'<div id="mw_wp_form_%s" class="mw_wp_form mw_wp_form_%s">
%s
<!-- end .mw_wp_form --></div>',
esc_attr( $form_key ),
esc_attr( $this->view_flg ),
$content
);
}
これで、確認画面出力直前の結果をフィルターで修正できるようになる。
次に、追加したフィルターを用いて、hiddenフィールドのvalueを確認画面に表示する。
と、その前の準備。
MW WP Formの完了画面メッセージに以下を追加しておく。
あなたのギフトコードは{hoge}です。
これで、確認画面に{hoge}という文字が埋め込まれるので、これをhiddenフィールドに入れた、UUIDに置換する、というフィルターを作成すればよい。
/**
* @param string $content
* @param MW_WP_Form_Data $Data
*/
function my_mwform_before_completemessage( $content,$Data) {
if ($Data) {
$giftCode = $Data['hoge'];
if($giftCode){
$content = str_replace('{hoge}',$giftCode,$content);
}
}
return $content;
}
add_filter( 'mwform_before_completemessage', 'my_mwform_before_completemessage', 10, 2 );
以上で、冒頭でも記述したやりたかったことができるようになります。
- 複数の設問を備えたアンケートの入力
- アンケートのお礼に何らかの重複しないギフトコードを表示する
まとめ
MW WP Formの作者さん、変なコードを入れてしまってすみません。
良い方法があれば教えてくださいm(_ _)m
もし、なければこんな感じの機能を追加してもらえると嬉しいです。