ContactForm7で入力途中の内容を自動保存する方法(保存→復元まで)
複数のContact Form 7フォームに対応し、各フォームの入力欄ごとに途中入力をブラウザに記憶する応用例です。フォームIDを限定せずに、自動で全てのフォームに対応します。
1 実装のポイント
- 複数フォームに対応(ページ内に複数の Contact Form 7 フォームがあってもすべて処理対象になります)
- 入力欄ごとに独立して保存
- ページを離れても内容が復元される
- フォーム送信後に該当フォームだけクリア
2 functions.php にコードを追加
// ------------------------------
// 複数フォーム対応・途中入力保存
// ------------------------------
function cf7_draft_save_button_script() {
?>
<script type="text/javascript">
(function(){
document.addEventListener('DOMContentLoaded', function(){
var forms = document.querySelectorAll('.wpcf7 form');
forms.forEach(function(form){
var formId = form.getAttribute('id') || form.dataset.wpcf7Id || 'cf7_form_default';
var fields = form.querySelectorAll('input[type=text], input[type=email], textarea, select');
// 一時保存ボタン作成
var saveBtn = document.createElement('button');
saveBtn.type = "button";
saveBtn.textContent = "一時保存";
saveBtn.className = "cf7-save-draft-btn";
// 送信ボタンの隣に挿入
var submitBtn = form.querySelector('input[type=submit], button.wpcf7-submit');
if(submitBtn && submitBtn.parentNode){
submitBtn.parentNode.insertBefore(saveBtn, submitBtn); // ← submitBtn の前に置く
} else {
form.appendChild(saveBtn);
}
// 保存処理
saveBtn.addEventListener('click', function(){
fields.forEach(function(field){
if(!field.name) return;
var key = 'cf7_' + formId + '_' + field.name;
localStorage.setItem(key, field.value);
});
alert("入力内容を保存しました。");
});
// 復元処理
fields.forEach(function(field){
if(!field.name) return;
var key = 'cf7_' + formId + '_' + field.name;
var saved = localStorage.getItem(key);
if(saved !== null) field.value = saved;
});
// 送信後クリア
form.addEventListener('wpcf7submit', function(){
fields.forEach(function(field){
if(!field.name) return;
var key = 'cf7_' + formId + '_' + field.name;
localStorage.removeItem(key);
});
}, false);
});
});
})();
</script>
<style>
.cf7-save-draft-btn {
margin-left: 10px; /* 送信ボタンとの間隔 */
padding: 8px 15px;
background: #eee;
border: 1px solid #ccc;
cursor: pointer;
}
.cf7-save-draft-btn:hover {
background: #ddd;
}
</style>
<?php
}
add_action('wp_footer', 'cf7_draft_save_button_script');
補足:
- フォームIDがない場合は自動生成し、各フォームごとに入力内容を区別します。
- localStorageは同一ドメイン内でのみ有効です。
- 特定のフォームだけに限定したい場合は
document.querySelectorAll('#your-form-id')に変更できます。
3 汎用CSS
/* -------------------------
* 複数フォーム対応・途中入力保存
---------------------------- */
/* 送信ボタン */
.wpcf7 input[type="submit"] {
background-color: #f90; /* 背景色(オレンジ) */
color: #fff; /* 文字色(白) */
border: none; /* 枠線なし */
border-radius: 5px; /* 角を丸める */
padding: 15px 30px; /* 内側余白(上下15px・左右30px) */
font-size: 1.1em; /* 文字サイズを少し大きめに */
cursor: pointer; /* カーソルをポインタ(手の形)にする */
transition: background-color 0.3s ease; /* ホバー時の色変化をなめらかに */
margin-top: 1em; /* 上に余白をとる */
}
.wpcf7 input[type="submit"]:hover {
background-color: #e07b00; /* ホバー時に少し濃いオレンジに変化 */
}
/* スマホ対応(画面幅600px以下) */
@media screen and (max-width: 600px) {
.wpcf7 input[type="submit"] {
margin-right:-5px !important;
}
.wpcf7 input[type="submit"] {
width: 100%; /* 送信ボタンも幅100% */
}
}
/* 一時保存ボタン */
.wpcf7 .cf7-save-draft-btn {
background-color: #28a745; /* 背景色(グリーン) */
color: #fff; /* 文字色(白) */
border: none; /* 枠線なし */
border-radius: 5px; /* 角を丸める */
padding: 15px 30px; /* 内側余白(上下15px・左右30px) */
font-size: 1.1em; /* 文字サイズを送信ボタンと同じに */
cursor: pointer; /* カーソルをポインタにする */
transition: background-color 0.3s ease; /* ホバー時の色変化をなめらかに */
margin-top: 1em; /* 上に余白をとる */
margin-right: 10px; /* 送信ボタンとの間に横スペースを入れる */
display: inline-block; /* 横並びで配置できるようにする */
}
.wpcf7 .cf7-save-draft-btn:hover {
background-color: #218838; /* ホバー時に少し濃いグリーンに変化 */
}
/* スマホ対応(画面幅600px以下) */
@media screen and (max-width: 600px) {
.cf7-save-draft-btn {
display: block; /* 横並び解除 */
width: 100%; /* 幅100% */
margin-right: 0; /* 右マージン解除 */
margin-bottom: 10px; /* 下に余白 */
margin-left:5px !important;
}
.wpcf7 input[type="submit"] {
width: 100%; /* 送信ボタンも幅100% */
}
}
4 代用プラグイン
- CF7 Smart Grid Design(フォームデザイン+部分入力保持対応)
- Save Contact Form 7 (Draft / Partial Form Save)
5 まとめ
- 複数フォーム・入力欄ごとに途中入力を自動保存
- フォーム送信後に該当フォームだけクリア
- テーマに応じたCSSでレイアウト調整可能
- ユーザーの利便性向上、離脱防止に効果的


