【WordPress】Contact Form 7のフォームごとに送信時のアクションを変える

contactform7のイメージ画像Contact Form 7 より

今回は、Contact Form 7を利用している問い合わせフォームで、送信完了後にそれぞれのフォームで別々のアクションをする方法をご紹介します

WordPress上で、すごく簡単に問い合わせフォームを作成するプラグインの1つに、Contact Form 7があります。 私も問い合わせフォームには、このプラグインを使用しています。

しかし、先日新たなフォームが欲しいと考えて設定した時に困った点がありました。新たなフォームでの送信時アクションの要件として、

①フォーム送信時に画像ファイルを保存したい
②このフォーム送信時のみ①のアクションを起こしたい

①については解決方法はあるのですが、②の

この新たなフォームの送信時の時のみアクションを起こす

という方法は記事が見当たらず手を焼いたので、記録がてら書きます。

参考として私自身のレベルは、Wordpressは触ったことはないが、他の言語を触っており、PHPやJSなどは抵抗なく読めるレベルです。

Contact Form 7とは

冒頭でも述べた通り、Contact Form 7はWordPressに問い合わせフォームを作る際にとても便利なプラグインです。HTMLやCSS、PHPの知識があればフォームは作成することもできますが、手軽に作成できるその特徴から、日本のみならず、海外でも広く使われています。

日本でも海外でも広く使われていることから、日本語での解説サイトが多いのはもちろん、関連したプラグインも多数存在します。関連したプラグインの例として、フォーム送信時に確認ページを表示するプラグインが挙げられます。

Contact Form 7でフォームの作成

今回はContact Form 7 でのフォームの作成や、設定、その他のカスタマイズなどの紹介は省きますが、私自身がフォーム作成時に参考になった記事を紹介します。フォームの作成から、カスタマイズ、関連するプラグインの紹介があるのでおすすめです。

Contact Form 7の設定方法と効果的なカスタマイズ方法
マーケティング目的でWordpressブログを運用するのであれば必要になるのが、問い合わせページだ。商品やサービスの問い合わせやメルマガ会員の増加など、ホームページ運営において使いやすい問い合わせページは必須と言える。 Wordpressの

今回の要件

今回の要件は以下の2つです。

①フォーム送信時に画像ファイルを保存したい
②このフォーム送信時のみ①のアクションを起こしたい

①について、Contact Form 7はファイルもアップロードすることも可能です。しかし、アップロードされたファイルは、WordPress上には残らず、メールに添付して確認するなどが一般的です。別の方法として、他のプラグイン(Contact Form 7 Database Addon)などを使用する方法などがあります。

プラグインを使えばいいのですが、今回は②のこのフォーム送信時のみアクションを起こすという点から、プラグインの使用はしませんでした。

上で述べた、2つの要件を満たすために書き加えたコードを紹介します。

WordPressカスタマイズで必要な知識

ここで、プログラミングに抵抗のない人がWordPressカスタマイズを行う際に必要と思った知識が2点あります。最初にこの知識があったら理解が早かったと思う点です。

①add_action()
②if文の条件分岐でadd_action()は使えない

①は、「WordPressカスタマイズ」で検索するとよく出てくる文言です。簡単に言えば、「あるアクションがあった時に、関数を呼び出せるよ」というものです。fuction.phpというすでに用意されているファイルに関数とadd_action()を書けば、動きます。参考になった記事は以下。

WordPress アクションフックとフィルターフック概論 | hijiriworld Web
WordPress アクションフックとフィルターフック概論 | hijiriworld Web

②については、詳細に説明することはできませんが条件分岐内でadd_action()が呼び出せなかった(?)です。この点は勘違い、知識不足だと思うので、説明があったらうれしいです。

今回の解決方法

画像ファイルを保存するアクションに関しては、すでにあるプラグイン「Store file uploads for Contact Form 7」の中身を参考にしました。

特定のフォームでアクションを起こすには、それぞれのフォームに与えられるidを、取り出して処理を書きます。Contact Form 7でフォームを設置するときに使用するショートコードの中にあるidの部分です。


[contact-form-7 id="ここの部分" title="Contact us"]

function nmr_create_attachment($filename)
{
// Check the type of file. We'll use this as the 'post_mime_type'.
    $filetype = wp_check_filetype(basename($filename), null);
// Get the path to the upload directory.
    $wp_upload_dir = wp_upload_dir();
    $attachFileName = $wp_upload_dir['path'] . '/' . basename($filename);
    $attachFileName = apply_filters('nmr_create_attachment_file_name', $attachFileName);
    copy($filename, $attachFileName);
// Prepare an array of post data for the attachment.
    $attachment = array(
        'guid' => $attachFileName,
        'post_mime_type' => $filetype['type'],
        'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
        'post_content' => '',
        'post_status' => 'inherit'
    );
// Notify subscribers with attachment data
    $attachment = apply_filters('nmr_before_insert_attachment', $attachment);
// Insert the attachment.
    $attach_id = wp_insert_attachment($attachment, $attachFileName);
// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it.
    require_once(ABSPATH . 'wp-admin/includes/image.php');
// Required for audio attachments
    require_once(ABSPATH . 'wp-admin/includes/media.php');
// Generate the metadata for the attachment, and update the database record.
    $attach_data = wp_generate_attachment_metadata($attach_id, $attachFileName);
    wp_update_attachment_metadata($attach_id, $attach_data);
    do_action('nmr_create_attachment_id_generated', $attach_id);
    return $attach_data;
}
function nmr_on_before_cf7_send_mail(\WPCF7_ContactForm $contactForm)
{
    $submission = WPCF7_Submission::get_instance();
    $form_id = $contactForm->id();
    if ($submission && $form_id == "フォームのID") {
        $uploaded_files = $submission->uploaded_files();
        if ($uploaded_files) {
            foreach ($uploaded_files as $fieldName => $filepath) {
                if (is_array($filepath)) {
                    foreach ($filepath as $key => $value) {
                        $data = nmr_create_attachment($value);
                    }
                } else {
                    $data = nmr_create_attachment($filepath);
                }
            }
        }
    }
}
add_action('wpcf7_before_send_mail', 'nmr_on_before_cf7_send_mail');

簡単に解説をします。

1行目~31行目:nmr_create_attachmentという関数で、画像ファイルを保存する処理を行う。$attachFileNameあたりを変更すれば、指定したディレクトリに保存することが可能。ディレクトリの指定方法は以下の通り。

戻り値
(配列)
ディレクトリのパスと URL を入れた配列、またはエラーメッセージを入れた配列。
もしパスを作れなければ、キー ‘error’ に値としてエラーメッセージを入れた配列を返します。親ディクレトリの書き込み許可がない可能性があります。

成功すると、返される配列にはたくさんのインデックスが含まれます:

‘path’ – ベースディレクトリとサブディクレトリを結合したパス、または upload ディクレトリのフルパス。
‘url’ – ベース url とサブディクレトリを結合した URL、または upload ディレクトリの絶対 URL。
‘subdir’ – 「アップロードしたファイルを年月ベースのフォルダに整理」が有効な場合、サブディレクトリ。
‘basedir’ – サブディレクトリを含まないパス。
‘baseurl’ – サブディレクトリを含まない URL パス。
‘error’ – false またはエラーメッセージ。

wpdocsのwp upload dirより

32行目~50行目:nmr_on_before_cf7_send_mailという関数で、フォームのidで条件を分岐してnmr_create_attachmentを呼び出して保存する処理を行う。

51行目:add_action()でフォームを送信してメールを送る前に、nmr_on_before_cf7_send_mailを呼び出している。

まとめ

今回はContact Form 7で特定のフォームでのみアクションを起こす方法を書きました。

WordPressは誰でも簡単にWebサイトを使える一方で、その手軽さゆえに自分のやりたいことに手が届かないことが多々あると思います。しかし、配布されているプラグインなどを参考にすると簡単にカスタマイズが可能です。配布してくれる方に感謝です。

他にも様々なカスタマイズに取り組みたいと思いました。不明な点があればご指摘お願いします。


コメント

タイトルとURLをコピーしました