質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

4回答

595閲覧

ひとつのページ内でメールを送信したいのですが、別ページに飛んでしまいます

TaiyoHayashi

総合スコア15

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2020/01/02 09:21

編集2020/01/02 10:54

ひとつのページ内でメールを送信したい

wordpressでお問い合わせフォームをプラグインなしで実装したいと思い自作しています。しかし、送信しても別のページに飛んでしまい、メールが送信されません。action属性の値を空欄にしておけば同じページに飛ぶはずなのに飛んでくれず、ちがうページに飛ぶのはなぜだかわからず、ご質問させてください。

該当のソースコード

php

1<?php 2 3/* 4Template Name: contact 5*/ 6 7if(!empty($_POST)){ 8 $pattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$"; 9 $confirm = array( 10 1=>'名前が入力されていません。', 11 2=>'メールアドレスが正しくありません。', 12 3=>'内容が入力されていません。', 13 4=>'文字数は70文字以内です。', 14 5=>'メッセージが送信されました。' 15 ); 16 $error = array(); 17 $name = htmlspecialchars($_POST["name"]); 18 $email = htmlspecialchars($_POST["email"]); 19 $message = htmlspecialchars($_POST["message"]); 20 21 if ($name = "") { 22 $error[1] = $confirm[1]; 23 } 24 if (preg_match($pattern, $email)) { 25 $error[2] = $confirm[2]; 26 } 27 if ($message = "") { 28 $error[3] = $confirm[3]; 29 } 30 if (mb_strlen($message) > 70){ 31 $error[4] = $confirm[4]; 32 } 33 if (count($error) === 0) {  //修正箇所です。(元のコードif ($error=array()) {) 34 mail( 'ここには僕のメールアドレスを入力しています。' , $email , $message , 'From:' . $email . '名前' . $name ); 35 $ok = $confirm[5]; 36 } 37 38} 39 40?> 41 42 <form id="mailform" action="" method="post"> 43 <div> 44 <label for="name">名前<span>(必須)</span></label> 45 <input type="text" name="name" id="name" required /> 46 </div> 47 <?php if(isset($error[1])): ?> 48 <p class="error"><?php echo $error[1]; ?></p> 49 <?php endif; ?> 50 <div> 51 <label for="mail">メールアドレス<span>(必須)</span></label> 52 <input ="email" name="email" id="mail" required /> 53 </div> 54 <?php if(isset($error[2])): ?> 55 <p class="error"><?php echo $error[2]; ?></p> 56 <?php endif; ?> 57 <div> 58 <label for="message">内容(70文字以内)</label> 59 <textarea name="message" id="message" rows="12" required></textarea> 60 </div> 61 <?php if(isset($error[3])): ?> 62 <p class="error"><?php echo $error[3]; ?></p> 63 <?php endif; ?> 64 <?php if(isset($error[4])): ?> 65 <p class="error"><?php echo $error[4]; ?></p> 66 <?php endif; ?> 67 <p class="contact-submit"> 68 <input type="submit" value="送信 »" id="submit"> 69 <input id="referrer" type="hidden" name="referrer" /> 70 </p> 71 <?php if(isset($ok)): ?> 72 <p class="ok">メッセージが送信されました。</p> 73 <?php endif; ?> 74 </form>

試したこと

acton属性の値を表示しているページのリンクにしましたが、同じ結果でした。

コードエディターはatomでxamppのローカル環境で開発しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2020/01/02 10:38

回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。後から見た人から見て、現在回答されておられる方の回答が「無いコードに対しての指摘」になり、意味がわからなくなります。
m.ts10806

2020/01/02 10:40

むしろ1つ目はそれほど大事ではなく2つ目以降を重点的に見てもらいたいのですが(4つ目なんて「重要」つけてますし) 結局、組んだ通りにしか動きませんので。。
TaiyoHayashi

2020/01/02 10:55

ご指摘ありがとうございます。直したことがわかるように編集しました。
guest

回答4

0

ベストアンサー

nameって名前がダメです
formの送信内容がWPに干渉しないようにするにはまず
wp_queryのquery_varsに引っかかる名前は入力値の名前に使うことはできません

php

1 $keys = array( 2 'error', 3 'm', 4 'p', 5 'post_parent', 6 'subpost', 7 'subpost_id', 8 'attachment', 9 'attachment_id', 10 'name', 11 'pagename', 12 'page_id', 13 'second', 14 'minute', 15 'hour', 16 'day', 17 'monthnum', 18 'year', 19 'w', 20 'category_name', 21 'tag', 22 'cat', 23 'tag_id', 24 'author', 25 'author_name', 26 'feed', 27 'tb', 28 'paged', 29 'meta_key', 30 'meta_value', 31 'preview', 32 's', 33 'sentence', 34 'title', 35 'fields', 36 'menu_order', 37 'embed', 38 );

投稿2020/01/02 12:08

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaiyoHayashi

2020/01/02 14:27

ご回答ありがとうございます。解決しました。wp_queryのquery_varsに引っかかる名前は使うことが出来ないことを知ることが出来てよかったです。おそらくググったとしてもなかなか解決にたどり着けなかったと思います。助かりました。
guest

0

WordPressは良く分かりませんが、幾つか気になる点を書いておきます。
ヒントとしてご活用ください。

1つ目。下記おかしいです。

PHP

1if ($error=array()) {

代入しているだけなので必ず成り立ちます。
「空なら」が表現したいのでしたら下記のような形が良いです。

php

1if(count($error) === 0){ 2

2つ目。
「必ず成り立つ」のでおそらくmail()関数は実行されるものとは思いますが、
mail()関数除いた場合はどうでしょう。

3つ目。
「別のページ」「ちがうページ」がどこか?次第で追記するかもしれません。

4つ目。(重要)
WordPress配下のページで書いているのでしたらWordPressの何かしらの影響を受けている可能性もあるので、単にactionを空にすればいいということにはならないかもしれません。
「プラグイン使わない」ということは「プラグイン作る」とイコールになるでしょうし、WordPress配下に作るのでしたらWordPressのアプリ構築のルールの影響を受けるように思います。
「単にPure PHP組んでれば通じる」ことにならない可能性もあります。
もう少し「プラグインの作り方」観点で深く調べてみてください。

投稿2020/01/02 09:48

編集2020/01/02 09:50
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaiyoHayashi

2020/01/02 11:34

ご回答ありがとうございます。 1つ目のご指摘いただいた個所は修正いたしました。 2つ目のご指摘で、mail関数を除いた場合で送信ボタンを押した場合も、メールは送信されずに違うページに飛んでしまいました。 3つ目のご指摘いただいた「別のページ」「ちがうページ」はindex.phpのページでした。なお、コンタクトフォームのページはcontact.phpで作っています。 4つ目の(重要)のご指摘を参考にもう一度調べ、解決を目指します。
m.ts10806

2020/01/02 11:41

そもそもそのcontact.phpはどこに置いてるんでしょう。 あとそのcontact.phpをブラウザ表示させた際に「ソースを表示」でhtml確認してみてください。formタグが想定の通りなっているかとか確認ですね。
m.ts10806

2020/01/02 11:44 編集

contact.phpにアクセスしているURL例もご提示ください(ドメインは例示ドメインか、ドメイン以下だけでも構いません) もしくは、そもそもactionの先が空でもWordPressのトップ(要はindex.php)をさすようなURLになっているか。 アクセスURL次第ですね。
m.ts10806

2020/01/02 11:43

2つ目について。 問題切り分けのためにmail()のかわりに下記置いてみてください。 echo "mail"; exit; もしこれで何も出力されなければそもそもcontact.phpが受け取るURLに送信されていないということになります。
TaiyoHayashi

2020/01/02 12:18

contact.phpはindex.phpと同じ階層においています。どちらもテーマフォルダの直下です。 html確認してみたところ、formタグのaction属性が下記のurlです。 http://localhost/wordpress/contact/ contactというのはパーマリンクのurlスラッグで指定した値です。 contact.phpにアクセスしているURLも確認しましたが同様です。同じurlなのにformだけ違うページに飛んでいるのおかしいなあって思います。 あと、不思議なのが、送信ボタンを押した後表示されている画面はindex.phpなのですが、url自体はhttp://localhost/wordpress/contact/と変わらずです。 2つ目について、mail()の代わりに echo "mail"; exit; を置きました。結果は先ほどと同様で、index.phpのページに飛びました。
m.ts10806

2020/01/02 12:25

WordPressのログに何か出てませんか?エラーとか。 (WordPress詳しいわけではないので調べてください)
guest

0

<?php /* Template Name: contact */ if(!empty($_POST)){ $pattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$"; $confirm = array( 1=>'名前が入力されていません。', 2=>'メールアドレスが正しくありません。', 3=>'内容が入力されていません。', 4=>'文字数は70文字以内です。', 5=>'メッセージが送信されました。' ); $error = array(); $name = htmlspecialchars($_POST["name"]); $email = htmlspecialchars($_POST["email"]); $message = htmlspecialchars($_POST["message"]); if ($name = "") { $error[1] = $confirm[1]; } if (preg_match($pattern, $email)) { $error[2] = $confirm[2]; } if ($message = "") { $error[3] = $confirm[3]; } if (mb_strlen($message) > 70){ $error[4] = $confirm[4]; } if (count($error) === 0) {  //修正箇所です。(元のコードif ($error=array()) {) mail( 'ここには僕のメールアドレスを入力しています。' , $email , $message , 'From:' . $email . '名前' . $name ); $ok = $confirm[5]; } } ?> <form id="mailform" action="" method="post"> <div> <label for="name">名前<span>(必須)</span></label> <input type="text" name="name" id="name" required /> </div> <?php if(isset($error[1])): ?> <p class="error"><?php echo $error[1]; ?></p> <?php endif; ?> <div> <label for="mail">メールアドレス<span>(必須)</span></label> <input ="email" name="email" id="mail" required /> </div> <?php if(isset($error[2])): ?> <p class="error"><?php echo $error[2]; ?></p> <?php endif; ?> <div> <label for="message">内容(70文字以内)</label> <textarea name="message" id="message" rows="12" required></textarea> </div> <?php if(isset($error[3])): ?> <p class="error"><?php echo $error[3]; ?></p> <?php endif; ?> <?php if(isset($error[4])): ?> <p class="error"><?php echo $error[4]; ?></p> <?php endif; ?> <p class="contact-submit"> <input type="submit" value="送信 »" id="submit"> <input id="referrer" type="hidden" name="referrer" /> </p> <?php if(isset($ok)): ?> <p class="ok">メッセージが送信されました。</p> <?php endif; ?> </form>

投稿2020/01/02 14:25

TaiyoHayashi

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

下記の //変更箇所 のnameをusernameに変更しました。
formの送信内容がWPに干渉しないようにする必要がありました。
wp_queryのquery_varsに引っかかる名前は入力値の名前に使うことはできないので、設定する値は気をつけなきゃですね。

php

1<?php 2 3/* 4Template Name: contact 5*/ 6 7if(!empty($_POST)){ 8 $pattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$"; 9 $confirm = array( 10 1=>'名前が入力されていません。', 11 2=>'メールアドレスが正しくありません。', 12 3=>'内容が入力されていません。', 13 4=>'文字数は70文字以内です。', 14 5=>'メッセージが送信されました。' 15 ); 16 $error = array(); 17 $username = htmlspecialchars($_POST["username"]); //変更箇所 18 $email = htmlspecialchars($_POST["email"]); 19 $message = htmlspecialchars($_POST["message"]); 20 21 if ($name = "") { 22 $error[1] = $confirm[1]; 23 } 24 if (preg_match($pattern, $email)) { 25 $error[2] = $confirm[2]; 26 } 27 if ($message = "") { 28 $error[3] = $confirm[3]; 29 } 30 if (mb_strlen($message) > 70){ 31 $error[4] = $confirm[4]; 32 } 33 if (count($error) === 0) {  //修正箇所です。(元のコードif ($error=array()) {) 34 mail( 'ここには僕のメールアドレスを入力しています。' , $email , $message , 'From:' . $email . '名前' . $username ); //変更箇所 35 $ok = $confirm[5]; 36 } 37 38} 39 40?> 41 42 <form id="mailform" action="" method="post"> 43 <div> 44 <label for="username">名前<span>(必須)</span></label> //変更箇所 45 <input type="text" name="username" id="username" required /> //変更箇所 46 </div> 47 <?php if(isset($error[1])): ?> 48 <p class="error"><?php echo $error[1]; ?></p> 49 <?php endif; ?> 50 <div> 51 <label for="mail">メールアドレス<span>(必須)</span></label> 52 <input ="email" name="email" id="mail" required /> 53 </div> 54 <?php if(isset($error[2])): ?> 55 <p class="error"><?php echo $error[2]; ?></p> 56 <?php endif; ?> 57 <div> 58 <label for="message">内容(70文字以内)</label> 59 <textarea name="message" id="message" rows="12" required></textarea> 60 </div> 61 <?php if(isset($error[3])): ?> 62 <p class="error"><?php echo $error[3]; ?></p> 63 <?php endif; ?> 64 <?php if(isset($error[4])): ?> 65 <p class="error"><?php echo $error[4]; ?></p> 66 <?php endif; ?> 67 <p class="contact-submit"> 68 <input type="submit" value="送信 »" id="submit"> 69 <input id="referrer" type="hidden" name="referrer" /> 70 </p> 71 <?php if(isset($ok)): ?> 72 <p class="ok">メッセージが送信されました。</p> 73 <?php endif; ?> 74 </form>

投稿2020/01/02 14:06

TaiyoHayashi

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/02 21:35

>WordPress配下に作るのでしたらWordPressのアプリ構築のルールの影響を受けるように思います。 ですから、ここが重要だと書いたのですが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問