WordPressでwebフォームの自作プラグインを作ってみた。
WordPressも随分昔からあるけど、いまだに現役なのね
webフォームを追加したい。CAPTCHA(キャプチャ)認証を追加したい。なんかメール誤送信があるのでどうかして欲しい。みたいな依頼が普通にくる
既存プラグインで良いと思うけど、他のプラグインと競合したり、謎な動作をするから解析して!とか言われる…。
既存プラグインだと、追加機能とかバグ修正などが難しいので、webフォームくらいなら自作プラグインでいいかな?
以下のソースをzip圧縮して、管理画面からプラグインをインストール&有効化すればOK
メール送信の環境構築がダルいので、投稿として管理画面から見れるようにした。
my-custom-form
メイン処理をするmy-custom-form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
<?php /* Plugin Name: My Custom Form URL Description: 特定のURLにアクセスした際にカスタムフォームを表示するプラグイン Version: 1.0 Author: あなたの名前 */ // セキュリティ対策:直接アクセスを防止 if (!defined('ABSPATH')) { exit; } // カスタムURLのリライトルールを追加する function my_custom_form_rewrite_rule() { add_rewrite_rule('^my-custom-form/?$', 'index.php?my_custom_form_page=1', 'top'); } add_action('init', 'my_custom_form_rewrite_rule'); // クエリ変数を追加する function my_custom_form_query_vars($query_vars) { $query_vars[] = 'my_custom_form_page'; return $query_vars; } add_filter('query_vars', 'my_custom_form_query_vars'); // テンプレートのリダイレクト処理 function my_custom_form_template_redirect() { $my_custom_form_page = get_query_var('my_custom_form_page'); if ($my_custom_form_page) { include plugin_dir_path(__FILE__) . 'templates/my-custom-form-template.php'; exit; } } add_action('template_redirect', 'my_custom_form_template_redirect'); // フォームデータを受け取る関数 function handle_my_custom_form() { // セキュリティ:ノンスのチェック(CSRF対策) if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'my_custom_form_nonce')) { wp_die('不正なリクエストです。'); } // フォームデータのサニタイズ $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : ''; $email = isset($_POST['email']) ? sanitize_email($_POST['email']) : ''; $message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : ''; // 必須フィールドのチェック if (empty($name) || empty($email) || empty($message)) { wp_die('全てのフィールドを入力してください。'); } // カスタム投稿タイプ "custom_contact" に問い合わせ内容を保存 $post_data = array( 'post_title' => 'お問い合わせ from ' . $name, 'post_content' => "名前: $name\nメールアドレス: $email\nメッセージ:\n$message", 'post_status' => 'publish', 'post_type' => 'custom_contact', ); $post_id = wp_insert_post($post_data); if ($post_id) { // 保存成功時のリダイレクト(サンクスページに移動) // wp_redirect(home_url('/arigatou/')); wp_redirect(home_url('/')); exit; } else { wp_die('お問い合わせの保存に失敗しました。もう一度お試しください。'); } } // 未ログインユーザー用のアクションフック add_action('admin_post_nopriv_my_custom_form', 'handle_my_custom_form'); // ログインユーザー用のアクションフック add_action('admin_post_my_custom_form', 'handle_my_custom_form'); // プラグイン有効化時にリライトルールを更新する function my_custom_form_activate() { my_custom_form_rewrite_rule(); flush_rewrite_rules(); } register_activation_hook(__FILE__, 'my_custom_form_activate'); // プラグイン無効化時にリライトルールを削除する function my_custom_form_deactivate() { flush_rewrite_rules(); } register_deactivation_hook(__FILE__, 'my_custom_form_deactivate'); // カスタム投稿タイプ "お問い合わせ" を作成 function create_custom_contact_post_type() { $labels = array( 'name' => 'お問い合わせ', 'singular_name' => 'お問い合わせ', 'menu_name' => 'お問い合わせ管理', 'name_admin_bar' => 'お問い合わせ', 'add_new' => '新規追加', 'add_new_item' => '新しいお問い合わせを追加', 'new_item' => '新しいお問い合わせ', 'edit_item' => 'お問い合わせを編集', 'view_item' => 'お問い合わせを表示', 'all_items' => '全てのお問い合わせ', 'search_items' => 'お問い合わせを検索', 'not_found' => 'お問い合わせが見つかりません', 'not_found_in_trash' => 'ゴミ箱にお問い合わせが見つかりません' ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => 25, 'supports' => array('title', 'editor'), ); register_post_type('custom_contact', $args); } add_action('init', 'create_custom_contact_post_type'); |
webフォーム画面
templates/my-custom-form-template.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php // セキュリティ対策:WordPressが直接呼び出されたか確認 if (!defined('ABSPATH')) { exit; } get_header(); // WordPressのヘッダーを表示 ?> <div class="my-custom-form-wrapper"> <h1>お問い合わせフォーム</h1> <form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="post"> <input type="hidden" name="action" value="my_custom_form"> <input type="hidden" name="_wpnonce" value="<?php echo wp_create_nonce('my_custom_form_nonce'); ?>"> <label for="name">名前:</label> <input type="text" id="name" name="name" required><br><br> <label for="email">メールアドレス:</label> <input type="email" id="email" name="email" required><br><br> <label for="message">メッセージ:</label><br> <textarea id="message" name="message" rows="5" required></textarea><br><br> <input type="submit" value="送信"> </form> </div> <?php get_footer(); // WordPressのフッターを表示 ?> |