Snow Monkey Formsのフォームに、URLのrefパラメーターを引き継ぐ例です。受信した問い合わせの流入元を見分ける補助情報として使います。
値は英数字・ハイフン・アンダースコアの1〜64文字に限定し、不正な値や未指定の場合は空にします。URLから渡す値は利用者が変更できるため、アクセス権・料金・紹介料の判定には使えません。
フォーム本体の設定はSnow Monkey Formsの設定手順を参照してください。
フォームにref項目を用意する
テキスト項目を追加し、NAMEをrefにします。パラメーターなしでも送信できるように必須項目にはせず、ラベルは非表示にします。
掲載コードはrefの入力欄とその内容を非表示にします。確認画面、入力画面へ戻る操作、入力エラーによる再表示でも、値と非表示状態を設定し直します。
管理者宛てメールに値を入れる
管理者宛てメール本文に、リファラル: {ref}を記載します。例として、フォームのURL末尾に?ref=suzukiを付けると、refにsuzukiを設定します。
コードを追加する
子テーマのfunctions.phpまたはPHPスニペットのどちらか一方へ追加します。既存のPHP内へ貼る場合は開始タグを追加しません。フォームIDの115は実際のIDに変更してください。
Snow Monkey Forms本体のsnow-monkey-formsスクリプトと一緒に読み込みます。本体を読み込み対象から除外したページや、JavaScriptが動かない環境では反映されません。
add_action( 'wp_enqueue_scripts', function () {
$script = <<<'JS'
(() => {
const formId = 'snow-monkey-form-115'; // 実際のフォームIDへ変更
const raw = new URLSearchParams(window.location.search).get('ref');
const value = raw && /^[A-Za-z0-9_-]{1,64}$/.test(raw) ? raw : '';
const applyRef = () => {
const form = document.getElementById(formId);
const field = form?.querySelector('input[name="ref"]');
if (!field) return;
field.value = value;
field.type = 'hidden';
const placeholder = field.closest('.smf-placeholder');
if (placeholder) placeholder.hidden = true;
};
const init = () => {
const form = document.getElementById(formId);
if (!form) return;
['smf.input', 'smf.back', 'smf.invalid', 'smf.confirm'].forEach((name) => {
form.addEventListener(name, applyRef);
});
applyRef();
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init, { once: true });
} else {
init();
}
})();
JS;
wp_add_inline_script( 'snow-monkey-forms', $script, 'after' );
}, 11 );URL・画面・受信メールを照合する
| 試す入力・操作 | 確認する値と画面 |
|---|---|
| ?ref=suzukiを付けて開く | refはsuzuki。入力欄と項目の内容は表示しない |
| refなしで開く | refは空。任意項目のため、それを理由に送信を止めない |
| 空値・日本語・65文字を渡す | 許可条件を満たさない値は空にする |
| 確認画面から入力へ戻る | 値を保持し、refの入力欄を再表示しない |
| 別の必須項目で入力エラーにする | 再表示後もrefの値と非表示状態を保つ |
| 管理者宛てメールを受信する | 本文の{ref}が指定値または空として反映されるか照合する |
refが画面に現れる場合は、対象フォームのIDとNAMEがコードと一致するか確認します。値が空の場合は、URLのrefが許可文字・1〜64文字の条件を満たすか確認します。英字の大文字・小文字はそのまま保持し、紹介元ごとに表記を決めておきます。
画面で値を確認できても、受信メールに同じ値が入るとは限りません。実際のメール受信が必要な段階では、テスト用の非個人情報の値を1件送信して、管理者宛てメールの設定と本文を照合します。画面の非表示は改ざん防止にはなりません。
2026年10月2日、WordPress 7.1.2・SWELL 2.19.0・SMF 13.0.0の隔離環境で、通常のCSRF検証を使った実HTTPの入力エラー・確認・戻る・完了を確認しました。
確認する操作と適用範囲
通常のページ表示でフォームを開き、ref付きURL、パラメーターなし、不正な値を確認します。確認画面から戻る操作と入力エラーの再表示でも、refが見えず値が残ることを確かめます。
SMF 13.0.0の実際のテキスト項目・フォームブロック・入力/確認/戻る/エラーのコントローラーを使用しました。公式JavaScriptによる項目の差し替えもDOMテストで確認しています。
今回の実HTTP検証では管理者メールの配送直前に本文を捕捉しており、実際の受信箱への到達、Pjaxや遅延挿入されたフォームは未検証です。
URLはログや履歴に残るため、メールアドレスなどの個人情報は入れません。refは参考情報として扱います。
refの確認・戻る・送信を試す
URL末尾に ?ref=campaign_01-A を付けて開き、別の必須欄を空にしたまま確認へ進んで入力エラーを表示します。
必須欄を入力して確認画面へ進み、戻る操作の後でもrefの入力欄や値が見えないことを確かめます。
確認画面から送信し、テスト用の管理者メール本文に campaign_01-A が入ることを照合します。
隔離環境ではこの操作後の生成メールに同じ値が入り、64文字の英字は保持され、未指定・日本語・65文字では空のまま送信が完了しました。
refのラベルも非表示にしたい場合は、フォーム項目側でラベルを非表示にする設定を確認してください。

元に戻す
追加したコードを停止し、キャッシュを更新します。ref項目やメールの{ref}が不要ならフォーム設定から外します。



