我使用mail()构建了一个简单的php联系表单。这个表格多年来一直在我的网站上发挥作用。
但是,我最近在wordpress上建立了一个新网站。我几乎复制并粘贴了相同的表单,但是,我没有收到任何电子邮件。当我点击提交时,表单只是重定向到主页/索引布局,但是有联系表单url。
但是,在原始网站上,会在空白屏幕上打印一条消息,确认已发送电子邮件。我还在原始网站上测试了原始代码,但它确实有效。
contact_form.php:
<?php
/*
Template Name: Contact Form
`*/
include( 'header.php');
?>
<?php
if(have_posts()): while (have_posts()): the_post();
?>
<div class="wrapper">
<div class="message">
<div class="text">
<?php the_content(); ?>
<form action="contact_form_script.php" method="post">
<p>Your email address:</p> <input type="text" name="emailAddress">
<p>Subject:</p> <input type="text" name="subject">
<p>Message:</p> <textarea name="message"></textarea>
<input type="text" name="honeyPot" style="display: none;">
<br />
<input type="submit" name="email_form" value="SUBMIT"/>
</form>
<br />
<br />
</div>
</div>
</div>
<?php
endwhile;
endif;
?>
<?php
include('footer.php');
?>
contact_form_script.php
<?php
$to= 'myEmailAddress@email.com';
$from = "FROM: Email@myDomain.com";
$replyTo=$_POST['emailAddress']; /*whatever the user input*/
$headers= $from ."\r\n" .'Reply-To: '. $replyTo;
//Have also tried just $_POST['subject']; Still doesn't work
$subj="Subject: "+$_POST['subject'];
$msg=$_POST['message'];
$spam=$_POST['honeyPot'];
if (empty($spam)){
mail($to, $subj, $msg, $headers);
};
Print "Thank you for email! <br /> <br /> <a href='/'><--BACK</a>"
?>
此外,有没有更好的方法来测试这样的表单以查看错误或以某种方式进行故障排除,而不仅仅是检查我是否收到了电子邮件?
答案 0 :(得分:2)
WordPress有很多方法可以完成你想要做的事情。
目前,您的表单操作指向contact_form_script.php
,假定此脚本位于当前目录中。但是当前目录与您的contact_form.php
无关。它与用户当前路径有关。例如www.mysite.com/contact /.
解决问题的一种快速(但懒惰)方法是将contact_form_script.php
移动到您网站的根WordPress目录中。然后更改form action="/contact_form_script.php"
(请注意/
),使其发布到根网站目录中名为contact_form_script.php
的文件中。
更好的方法是将contact_form_script.php
保留在模板目录中并将其包含在functions.php中。
如果我们使用email_form
提交输入让WordPress知道需要加载contact_form_script.php
脚本,这应该允许您加载整个wordpress核心并仍然有自定义表单处理脚本交易数据:
的functions.php:
if (!empty($_POST['email_form'])) {
require_once(__DIR__.'/contact_form_script.php');
// You could put a die() here if you wanted the script to stop executing.
}
contact_form.php:
include( 'header.php');
if(have_posts()): while (have_posts()): the_post();
<div class="wrapper">
<div class="message">
<div class="text">
<?php the_content(); ?>
<form action="" method="post"> <!-- Notice we are now submitting our data to wordpress and not directly to our form script -->
<p>Your email address:</p> <input type="text" name="emailAddress">
<p>Subject:</p> <input type="text" name="subject">
<p>Message:</p> <textarea name="message"></textarea>
<input type="text" name="honeyPot" style="display: none;">
<br />
<input type="submit" name="email_form" value="SUBMIT"/>
</form>
<br />
<br />
</div>
</div>
</div>
同样,这并不理想,但我怀疑你现在正在寻找什么,这是朝着正确方向迈出的一步。将代码保存在模板中。
答案 1 :(得分:1)
更改以下内容
mail($to, $subj, $msg, $headers);
进入
wp_mail($to, $subj, $msg, $headers);
这将让WordPress正确路由您的邮件。
另外作为一个整体...你应该使用wp_ajax来做到这一点,你可以使用它而无需编写任何javascript ...创建一个包含在以下函数中的文件。
function process_contact_form() {
$to= 'myEmailAddress@email.com';
$from = "FROM: Email@myDomain.com";
$replyTo=$_POST['emailAddress']; /*whatever the user input*/
$headers= $from ."\r\n" .'Reply-To: '. $replyTo;
//Have also tried just $_POST['subject']; Still doesn't work
$subj="Subject: "+$_POST['subject'];
$msg=$_POST['message'];
$spam=$_POST['honeyPot'];
if (empty($spam)){
wp_mail($to, $subj, $msg, $headers);
};
header('Location:'.$_REQUEST['_wp_http_referer']);
wp_die();
}
add_action( 'wp_ajax_process_contact_form', 'process_contact_form' );
add_action( 'wp_ajax_nopriv_process_contact_form', 'process_contact_form' );
将模板文件更改为
<?php
/*
Template Name: Contact Form
`*/
include( 'header.php');
?>
<?php
if(have_posts()): while (have_posts()): the_post();
?>
<div class="wrapper">
<div class="message">
<div class="text">
<?php the_content(); ?>
<form action="<?php echo admin_url( 'admin-ajax.php' ); ?>" method="post">
<p>Your email address:</p> <input type="text" name="emailAddress">
<p>Subject:</p> <input type="text" name="subject">
<p>Message:</p> <textarea name="message"></textarea>
<?php wp_referer_field(true); ?>
<input type="hidden" name="action" value="process_contact_form">
<input type="text" name="honeyPot" style="display: none;">
<br />
<input type="submit" name="email_form" value="SUBMIT"/>
</form>
<br />
<br />
</div>
</div>
</div>
<?php
endwhile;
endif;
?>
<?php
include('footer.php');
?>
答案 2 :(得分:0)