WordPressでdo_shortcodeでフォームを読み込むとzipaddr-jpが動かない原因と対処法
zipaddr-jp は、郵便番号から住所を自動入力できる便利なJavaScriptライブラリです。
Contact Form 7 などのフォームと組み合わせて使用している方も多いのではないでしょうか。
しかし、WordPressのテンプレートファイル(single.php など)で PHPでショートコードを直接読み込んだ場合、zipaddr-jp が正常に動作しないことがあります。
この記事では、
- WordPressでzipaddr-jpが動かない状況
- その原因
- functions.php を使った対処方法
について解説します。
zipaddr-jpが機能しない状況
zipaddr-jp を使用したフォームを WordPress に設置している場合、通常は郵便番号を入力すると住所が自動入力されます。
しかし、以下のように PHPでショートコードを直接読み込んだ場合、zipaddr-jp が動作しないことがあります。
例えば、single.php や固定ページテンプレートなどで以下のようにフォームを表示しているケースです。
|
1 |
<?php echo do_shortcode('[contact-form-7 id="123456s" title="お問い合わせフォーム"]'); ?> |
原因:zipaddr-jpのスクリプトが読み込まれていない
zipaddr-jp の JavaScript がページに正常に読み込まれている場合は、ソース内に以下のような記述が見つかります。
|
1 |
<script type="text/javascript" charset="UTF-8" src="https://zipaddr.github.io/zipaddrx.js?v=1.42"></script> |
しかし、テンプレートファイルから do_shortcode() でフォームを直接表示した場合、スクリプトの読み込み処理が正しく実行されないケースがあります。
その結果、zipaddr-jp の住所自動入力機能が動作しなくなります。
対処法1:記事本文内にショートコードを記述する
最もシンプルな方法は、記事本文内にフォームのショートコードを記述する方法です。
記事内にフォームのショートコードを記述
固定ページや投稿ページの本文に、フォームのショートコードをそのまま記述します。
|
1 |
[contact-form-7 id="123456s" title="お問い合わせフォーム"] |
テンプレートファイルに the_content() を記述
そして、テンプレートファイル(例:single.php)に以下のコードを記述します。
|
1 |
<?php the_content(); ?> |
この方法でフォームを表示すると、WordPressの通常の投稿処理を通るため、Contact Form 7 や zipaddr-jp のスクリプトが正しく読み込まれるようになります。
テンプレートファイルから do_shortcode() を直接呼び出すよりも、WordPressの標準的な実装に近い方法です。
対処法2:functions.php にフックを記述してスクリプトを読み込む
テンプレートファイル側で直接フォームを表示する必要がある場合は、functions.php に zipaddr-jp のスクリプトを読み込む処理を追加することで対応できます。
functions.php の記述例
|
1 2 3 4 5 6 7 8 9 10 11 |
add_action('wp_enqueue_scripts', function () { if (is_singular('contact')) { wp_enqueue_script( 'zipaddr-js', 'https://zipaddr.github.io/zipaddrx.js?v=1.42', [], null, true ); } }); |
解説
このコードでは、WordPressの wp_enqueue_scripts フックを利用して、
zipaddr-jpプラグインを使用せずに ZipAddr の JavaScript(zipaddrx.js)を直接読み込んでいます。
is_singular('contact') を指定することで、特定の投稿タイプ(contact)の詳細ページのみでスクリプトを読み込む設定になっています。
※ if (is_singular('contact')) の 'contact' 部分は、使用している 投稿タイプのスラッグ名に変更してください。
※ 特定の single.php ではなく、固定ページ(page)で使用したい場合は、次のように is_page() を使用します。
|
1 |
if (is_page('contact')) |
※ すべてのページで zipaddr-jp を使用する場合は、条件分岐を削除してスクリプトを読み込むことも可能です。
まとめ
WordPressで zipaddr-jp が機能しない場合は、JavaScriptが正しく読み込まれていないことが原因であるケースが多くあります。
特に、テンプレートファイルから do_shortcode() を利用してフォームを表示している場合は注意が必要です。
対処方法としては、次の2つがあります。
- 記事本文にショートコードを記述し、
the_content()で表示する functions.phpにフックを追加して zipaddr-jp のスクリプトを読み込む
用途に応じて、適切な方法を選択しましょう。
![MARKLEAPS[マークリープス]](https://markleaps.com/blog/wp-content/themes/mkl/images/00_logo.png)