LoginSignup
3
3

More than 5 years have passed since last update.

【WordPress✕MW_WP_Form + α】フォームから入力後の確認画面で、所定の動的な文字・数字を表示する

Last updated at Posted at 2016-08-13

WordPressを導入しているサイトで、以下のことをやりたかったのですが、良い方法が思い浮かばず、結局既存のプラグインに手を加えてしまったお話

やりたかったこと

  1. 複数の設問を備えたアンケートの入力
  2. アンケートのお礼に何らかの重複しないギフトコードを表示する

以下、色々がんばっちゃっているのですが、もっと素敵な方法があったら教えてほしい。。

アンケートの入力フォームプラグイン

有名所だと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 );

以上で、冒頭でも記述したやりたかったことができるようになります。

  1. 複数の設問を備えたアンケートの入力
  2. アンケートのお礼に何らかの重複しないギフトコードを表示する

まとめ

MW WP Formの作者さん、変なコードを入れてしまってすみません。
良い方法があれば教えてくださいm(_ _)m
もし、なければこんな感じの機能を追加してもらえると嬉しいです。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3