PHP联系表单不适用于Wordpress

时间:2018-05-17 13:43:30

标签: php wordpress email-integration

我使用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>"


?>

此外,有没有更好的方法来测试这样的表单以查看错误或以某种方式进行故障排除,而不仅仅是检查我是否收到了电子邮件?

3 个答案:

答案 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)

我们最近遇到了与我们联系表格类似的问题。显然,问题不是我们的PHP出现问题的结果,而是共享主机策略的变化。当然,如果您使用VPS,这不会是一个问题。

但是,如果您使用cPanel和任何形式的基于脚本的电子邮件(包括Contact Form 7)进行任何形式的共享托管,这可能是一种潜在的解决方案。

使用&#34;纸灯&#34;主题,选择选项&#34;挂号邮件ID&#34;如下: link to choose

然后您应该可以选择添加其他电子邮件ID。只需输入您在脚本中使用的电子邮件ID即可。在大约8个小时内,ID应该已经传播,您将能够使用您的脚本。

希望这有帮助!我们花了很长时间才弄明白。