こんにちは!
川口でWEB屋さんをやっていますTEDASKのSeitoです。
今回は、WordPressでお問合せフォームを作る際に、プラグインではなく決済も含めたフォームなど自作でフォームを作る場合もあるかと思いますが、その際に注意しなければいけない点についてお伝えしたいと思います。
nameなどのWordPressの予約語を送信してはいけない
まず結論を先に書くとWordPressには予約語というWordPressで機能的に使われているパラメータがあります。
その一つにnameがあります。フォームではお名前のところにname=”name”などよく使う例もあると思いますが、このnameをformから送信すると、404エラーが返ってきてしまいます。
この予約語については、公式サイトのCodexに掲載されておりますので、formで使っているパラメータ名が予約語と被っていないか必ず確認するようにしましょう。
以下の予約語を避けることが非常に重要です。特にタームを $_GET や $_POST 配列を使って引き渡す場合は注意してください。もし重複すると、WordPress は何のヒントも説明も無しに 404 エラーを返します。
- attachment
- attachment_id
- author
- author_name
- calendar
- cat
- category
- category__and
- category__in
- category__not_in
- category_name
- comments_per_page
- comments_popup
- customize_messenger_channel
- customized
- cpage
- day
- debug
- error
- exact
- feed
- fields
- hour
- link_category
- m
- minute
- monthnum
- more
- name
- nav_menu
- nonce
- nopaging
- offset
- order
- orderby
- p
- page
- page_id
- paged
- pagename
- pb
- perm
- post
- post__in
- post__not_in
- post_format
- post_mime_type
- post_status
- post_tag
- post_type
- posts
- posts_per_archive_page
- posts_per_page
- preview
- robots
- s
- search
- second
- sentence
- showposts
- static
- subpost
- subpost_id
- tag
- tag__and
- tag__in
- tag__not_in
- tag_id
- tag_slug__and
- tag_slug__in
- taxonomy
- tb
- term
- theme
- type
- w
- withcomments
- withoutcomments
- year
参照:Codex関数リファレンス/register taxonomy
どのようになるか実験
今回の実験用のページ構成は
- お問い合わせページ(/form-test)
- お問い合わせ確認ページ(/confirm)
この2ページです。エラーの確認なので送信まではやりません。
フォームはPHPを使って作りますので、今回はpage-form-test.phpというテンプレートを作って、フォームを作りました。
<form method="POST" action="<?php echo home_url().'/confirm'; ?>"> <label>お名前</label> <input type="text" name="name"> <label>メールアドレス</label> <input type="email" name="email"> <label>お問い合わせ内容</label> <textarea name="body"></textarea> <button style="margin-top:2rem;" type="submit">確認</button> </form>
本来は、フォームからデータを受け取らない限りは、確認ページは見られてはいけなくて、お問い合わせのページにリダイレクトで戻す必要があるのですが、今回は説明上、見られるようにしています。
URLも/confirmというURLでページが表示されているのを覚えておいてください。
では、この状態で、フォームから送信してみます。
といった感じで、先程は/confirmのページに直接アクセスするとページが見れていたのに、送信した途端「ページが見つかりません」のページになりました。
このように、nameの予約語を送信したため、エラーが起こっています。
<form method="POST" action="<?php echo home_url().'/confirm'; ?>"> <label>お名前</label> <input type="text" name="s_name"> <label>メールアドレス</label> <input type="s_email" name="email"> <label>お問い合わせ内容</label> <textarea name="s_body"></textarea> <button style="margin-top:2rem;" type="submit">確認</button> </form>
先程のコードのプロパティ名を全てs_を付けてnameという名前を避けて送信してみます。
すると、無事フォームの確認ページが表示されました。
※このformのコードについてはあくまでエラーの実験をするためのもので、CSRF対策などは一切行っておりませんので、実際にフォームを自作する際は、適宜クロスサイト・スクリプティング対策やCSRF対策を行うようにして下さい。
まとめ
今回は、WordPressの予約語について説明しました。
お問い合わせフォームを自作することは少ないかと思いますが、WordPressを駆使してECや予約サイトなどを作ると検索するためのフォームが必要になりますが、その時にもこの予約語でハマってしまうことがあります。
WordPressでページが存在するのに404エラーが出たときはこの予約語の問題の可能性が高いので、開発の際は気を付けてくださいね。
以上、「WordPressで自作フォームでデータを送信すると404やindex.phpが表示される理由。name=”name”は使ってはいけません。」でした!
コメント