Web開発

WordPress住所自動入力の完全ガイド|簡単なライブラリ版から複数候補対応API版まで

スポンサーリンク

Webフォームの住所入力、郵便番号を入れただけで完了する手軽さは、今や当たり前。
しかし、その実装、本当に「親切」ですか?京都市内のように、1つの郵便番号に複数の住所候補が存在するケースで、ユーザーを混乱させてはいませんか?
この記事では、コピペで終わる簡単な【ライブラリ版】の実装から、複数候補をポップアップで選択させる本格的な【API版】まで、2つの方法を徹底解説します。
あなたのサイトに「おもてなしの心」を実装し、ライバルに差をつけましょう。


あなたはどっち?目的とスキルで選ぶ2つの住所自動入力の実装方法

WordPressサイトで住所自動入力を実装するには、大きく2つのアプローチがあります。
あなたのサイトの目的と、あなたが使える時間やスキルに合わせて、最適な方法を選びましょう。

【方法1】とにかく簡単・最速で実装したい → YubinBango(ライブラリ)版

「プログラミングはよくわからないけど、今すぐサイトに導入したい!」という方には、YubinBangoという無料のJavaScriptライブラリを使う方法が最適です。

  • 向いている人: 個人ECサイト運営者など、非エンジニアの方。
  • メリット: コードをコピー&ペーストするだけで実装でき、非常にスピーディー。
  • デメリット: 複数住所候補への対応など、細かい挙動のカスタマイズは難しい。

【方法2】最高のUXを提供したい → ポップアップ選択式(API)版

「ユーザー体験を極限まで高めたい」「他のサイトと差別化できる、本当に親切な機能を実装したい」という方には、zipcloud APIとJavaScriptを組み合わせ、複数候補をポップアップで選択させる方法がベストです。

  • 向いている人: 駆け出しのエンジニアや、高品質なWebサイトを作りたい開発者。
  • メリット: 複数住所候補に完全対応でき、最高のUXを提供できる。JavaScriptのスキルも向上する。
  • デメリット: HTML/CSS/JSの知識が必要で、実装に時間がかかる。

【比較表】ライブラリ版 vs API版、メリット・デメリットまとめ

Webディレクターのように、両方の選択肢を客観的に評価したい方のために、2つの方法を比較しました。

評価軸ライブラリ版(YubinBango)API版(ポップアップ選択式)
実装の簡単さ★★★★★(非常に簡単)★★☆☆☆(やや難しい)
UX品質★★★☆☆(複数候補に非対応)★★★★★(複数候補に完全対応)
カスタマイズ性★★☆☆☆(限定的)★★★★★(自由自在)
おすすめの人非エンジニア、スピード重視の方エンジニア、品質・UXを追求する方

【ライブラリ版】コピペでOK!Contact Form 7にYubinBangoで実装する最速手順

この章は、プログラミングが苦手な方向けです。
専門用語は一切なしで、コピペだけで実装できるよう解説します。

Step 1: YubinBangoのスクリプトをWordPressに設置する

まず、YubinBangoをサイトで使えるようにするための「おまじないのコード」を設置します。

  1. 以下の1行のコードをコピーします。
     <script src="https://yubinbango.github.io/yubinbango/yubinbango.js" charset="UTF-8"></script>
  2. WordPressの管理画面で、プラグイン「Insert Headers and Footers by WPBeginner」をインストールし、有効化します。
  3. プラグインの設定画面を開き、「Scripts in Footer」の欄に、先ほどコピーしたコードを貼り付けて保存すれば完了です。

Step 2: Contact Form 7のフォームに指定のクラス名を設定する【コピペ用コードあり】

次に、Contact Form 7のフォームを編集します。
以下のコピペ用コードを参考に、class:の部分を正しく設定してください。
これがYubinBangoが住所を自動入力するための「目印」になります。

【コピペ用コード】

<p>郵便番号(ハイフン不要)<br>
<span class="p-country-name" style="display:none;">Japan</span>
[text* your-zip class:p-postal-code size:8 maxlength:8 placeholder "例) 1000001"]
</p>
<p>都道府県<br>
[text* your-prefecture class:p-region]
</p>
<p>市区町村番地<br>
[text* your-address class:p-locality class:p-street-address]
</p>

Step 3: 動作確認とトラブルシューティング

フォームを設置したページで、郵便番号を入力して住所が自動で入れば成功です!
もし動かない場合は、以下の点を確認してみてください。

  • YubinBangoのコードは正しく設置されていますか?
  • class:の名前は半角で、スペルミスはありませんか?
  • キャッシュ系プラグインを利用している場合は、キャッシュを削除してみましたか?

【API版】高品質なUIを実現!ポップアップ選択式フォームの作り方

この章は、最高のUXを目指すエンジニアや開発者向けです。
これから紹介するコードを参考に、高品質な住所自動入力機能を実装しましょう。

See the Pen Untitled by take it easy (@take-it-easy) on CodePen.

なぜこの機能が必要?京都市の例で見る「複数住所問題」の重要性

ECサイト運営において、フォームの離脱率は深刻な問題です。
例えば、愛知県の郵便番号「452-0961」を検索すると、複数の町名が候補として存在します。
ここで不親切な自動入力をしてしまうと、ユーザーは混乱し、面倒になって入力をやめてしまいます(カゴ落ち)。
この「複数住所問題」にスマートに対応することが、フォームの離脱率を改善し、CVRを向上させる鍵なのです。

Step 1: 骨格となるHTMLを用意する

まず、入力フォームと、非表示状態のポップアップ(モーダル)の骨格をHTMLで記述します。JavaScriptから操作できるよう、各要素にidを割り振っておきます。

<!-- フォーム本体 -->
<div class="container">
<h2>住所自動入力フォーム</h2>
<div class="form-group">
<label>郵便番号</label>
<input type="text" id="zipcode" placeholder="例:1000001">
<button id="searchButton">住所検索</button>
</div>
<div class="form-group">
<label>都道府県</label>
<input type="text" id="prefecture" readonly>
</div>
<div class="form-group">
<label>市区町村</label>
<input type="text" id="city" readonly>
</div>
<div class="form-group">
<label>町域・番地</label>
<input type="text" id="address" readonly>
</div>
<div class="form-group">
<label>ビル名等</label>
<input type="text" id="building">
</div>
</div>

<!-- 住所選択モーダル(初期状態は非表示) -->
<div id="modal" class="modal-overlay">
<div class="modal-content">
<h3>住所を選択してください</h3>
<div id="addressList"></div>
<div class="modal-buttons">
<button id="decisionButton">決定</button>
<button id="closeButton">閉じる</button>
</div>
</div>
</div>

Step 2: 見た目を整えるCSSを適用する

次に、CSSでフォームとモーダルの見た目を整えます。
モーダルを画面中央に美しく表示させるためのスタイルです。

/* 基本的なフォームスタイル */
.container {
max-width: 600px;
margin: 2em auto;
padding: 2em;
border: 1px solid #ccc;
border-radius: 8px;
font-family: sans-serif;
}

.form-group {
margin-bottom: 1em;
}

label {
display: block;
margin-bottom: .5em;
font-weight: bold;
}

input[type="text"] {
width: 100%;
padding: 8px;
box-sizing: border-box;
border: 1px solid #ccc;
border-radius: 4px;
}

input[readonly] {
background-color: #f0f0f0;
cursor: not-allowed;
}

button {
padding: 10px 15px;
border: none;
border-radius: 4px;
color: #fff;
background-color: #007bff;
cursor: pointer;
}

button:hover {
background-color: #0056b3;
}

/* モーダルウィンドウのスタイル */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
display: none; /* 初期状態は非表示 */
align-items: center;
justify-content: center;
z-index: 1000;
}

.modal-content {
background: #fff;
padding: 20px 30px;
border-radius: 8px;
width: 90%;
max-width: 500px;
box-shadow: 0 4px 15px rgba(0,0,0,0.2);
}

.modal-content h3 {
margin-top: 0;
}

.modal-buttons {
margin-top: 20px;
text-align: right;
}

.modal-buttons button {
margin-left: 10px;
}

.modal-buttons #closeButton {
background-color: #6c757d;
}

.modal-buttons #closeButton:hover {
background-color: #5a6268;
}

/* 【最終修正版】住所候補リストのスタイル */
#addressList {
max-height: 350px; /* 高さを最大350pxに制限 */
overflow-y: auto; /* 高さを超えた場合にのみ縦スクロールバーを表示 */
border: 1px solid #eee; /* スクロール範囲を視覚的に示すための枠線 */
padding: 10px; /* 内側の余白 */
border-radius: 4px; /* 角を少し丸める */
}

/* ラジオボタンとラベルのレイアウト */
#addressList div {
display: flex; /* Flexboxを適用して横並びに */
align-items: center; /* 要素を縦方向の中央に揃える */
margin-bottom: 10px;
}

#addressList input[type="radio"] {
margin-right: 8px; /* ラジオボタンと住所ラベルの間に余白を設ける */
flex-shrink: 0; /* ラジオボタンが縮まないようにする */
}

#addressList label {
font-weight: normal;
margin-bottom: 0; /* 親のdivで余白を管理するためリセット */
}

Step 3: 機能の心臓部となるJavaScriptを実装する

いよいよ、この機能の全てを制御するJavaScriptの実装です。

【JS詳細解説①】API通信と、結果件数での条件分岐

「住所検索」ボタンがクリックされたら、fetchを使ってzipcloud APIにリクエストを送ります。
そして、返ってきた結果(data.results)の件数に応じて、その後の処理を分岐させるのが最大のポイントです。

// HTML要素の取得
const searchButton = document.getElementById('searchButton');
const modal = document.getElementById('modal');
const decisionButton = document.getElementById('decisionButton');
const closeButton = document.getElementById('closeButton');
const zipcodeEl = document.getElementById('zipcode');
const prefectureEl = document.getElementById('prefecture');
const cityEl = document.getElementById('city');
const addressEl = document.getElementById('address');

// 検索ボタンクリック時のイベント
searchButton.addEventListener('click', () => {
const zipcode = zipcodeEl.value;
// 7桁でなければ処理中断
if (!zipcode || zipcode.length !== 7) {
alert('7桁の郵便番号を入力してください。');
return;
}

fetch(`https://zipcloud.ibsnet.co.jp/api/search?zipcode=${zipcode}`)
.then(response => {
if (!response.ok) {
throw new Error('ネットワークの応答が正常ではありませんでした。');
}
return response.json();
})
.then(data => {
if (data.results === null) {
alert('該当する住所が見つかりませんでした。');
return;
}

const results = data.results;
const addressCount = results.length;

// 【条件分岐】
if (addressCount === 1) {
// 住所が1件の場合の処理
const result = results[0];
prefectureEl.value = result.address1;
cityEl.value = result.address2;
addressEl.value = result.address3;
} else {
// 住所が複数件の場合の処理
const addressList = document.getElementById('addressList');
addressList.innerHTML = ''; // 前回の中身をクリア

results.forEach((result, index) => {
const addressText = `${result.address1} ${result.address2} ${result.address3}`;

const div = document.createElement('div');
const radio = document.createElement('input');
radio.type = 'radio';
radio.name = 'addressOption';
radio.id = 'option' + index;
radio.dataset.prefecture = result.address1;
radio.dataset.city = result.address2;
radio.dataset.address = result.address3;

const label = document.createElement('label');
label.htmlFor = 'option' + index;
label.textContent = addressText;

div.appendChild(radio);
div.appendChild(label);
addressList.appendChild(div);
});
modal.style.display = 'flex'; // ポップアップを表示
}
})
.catch(error => {
alert('住所の取得に失敗しました。ネットワーク環境をご確認の上、再度お試しください。');
console.error('エラー:', error);
});
});

// 決定ボタンクリック時の処理
decisionButton.addEventListener('click', () => {
const selectedRadio = document.querySelector('input[name="addressOption"]:checked');
if (selectedRadio) {
prefectureEl.value = selectedRadio.dataset.prefecture;
cityEl.value = selectedRadio.dataset.city;
addressEl.value = selectedRadio.dataset.address;
modal.style.display = 'none'; // ポップアップを閉じる
} else {
alert('住所を選択してください。');
}
});

// 閉じるボタンのイベント
closeButton.addEventListener('click', () => modal.style.display = 'none');

ケーススタディ|この「神対応」がビジネスの成果に繋がる理由

ECサイト:カゴ落ち率を改善し、売上を最大化する

不親切なフォームは、カゴ落ちの最大の原因の一つです。
複数住所候補にまで配慮したフォームは、ユーザーの入力ストレスを極限まで減らし、購入完了率(CVR)の向上に直接貢献します。

BtoBサイト:入力ストレスのないフォームで、質の高いリードを獲得する

企業の問い合わせフォームでも同様です。
スムーズな入力体験は、企業への信頼感を醸成し、質の高い見込み客(リード)の獲得機会を最大化します。


FAQ(よくある質問)

Q1. 私のサイトには、ライブラリ版とAPI版のどちらがおすすめですか?
A. **手軽さとスピードを最優先するなら【ライブラリ版】**です。**最高のユーザー体験とサイトの品質を追求するなら【API版】**をおすすめします。あなたの目的とスキルに合わせてご選択ください。

Q2. zipcloud APIに利用制限はありますか?
A. 公式サイトに明確な上限は明記されていませんが、「サーバーに負荷をかけるようなご利用はご遠慮ください」とあります。一般的なフォームでの利用であれば問題ありません。

Q3. ポップアップのデザインは変更できますか?
A. はい、提供するCSSコードを修正することで、サイトのデザインに合わせて色やサイズを自由に変更できます。

Q4. YubinBangoでも複数候補に対応できますか?
A. YubinBangoライブラリの標準機能では、ポップアップ選択のような高度な対応はできません。複数候補への丁寧な対応を求める場合は、API版の実装が必要になります。


まとめ

住所自動入力は、手軽さを求めるなら【ライブラリ版】最高のユーザー体験を追求するなら【ポップアップ選択機能付きAPI版】という選択肢があります。
特に後者は、ユーザーの小さな不満を解消し、サイトへの信頼を大きく育てる「おもてなし」の機能です。
この記事で提供したコードを参考に、あなたのサイトのフォームを、ただ便利なだけでなく「本当に親切な」フォームへと進化させてください。

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