代码之家  ›  专栏  ›  技术社区  ›  auto

PHP联系人表单在Wordpress上不起作用

  •  1
  • auto  · 技术社区  · 8 年前

    我使用mail()构建了一个简单的php联系人表单。这个表格在我的网站上已经使用多年了。

    然而,我最近在wordpress上建立了一个新网站。我几乎复制并粘贴了相同的表单,但是,我没有收到任何电子邮件。当我点击提交时,表单只是重定向到主页/索引布局,但有联系人表单url。

    然而,在最初的网站上,一条消息被打印在一个空白屏幕上,确认电子邮件已发送。我还测试了原始站点上的原始代码,它可以正常工作。

    联系表格。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');
    ?>
    

    联系\u form\u脚本。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 回复  |  直到 8 年前
        1
  •  2
  •   Leigh Bicknell    8 年前

    在WordPress中有很多方法可以完成你想要做的事情。

    目前你的表单操作指向 contact_form_script.php 它假定此脚本位于当前目录中。但当前目录与 contact_form.php 。它相对于用户当前路径。例如www.mysite。com/contact/。

    解决问题的一个快速(但懒惰)方法是搬家 联系\u form\u脚本。php 进入站点的根WordPress目录。然后更改 form action="/contact_form_script.php" (请注意 / )使其发布到名为 联系\u form\u脚本。php 在根站点目录中。

    更好的方法是 联系\u form\u脚本。php 在模板目录中,并将其包含在函数中。php。

    如果我们使用 email_form 提交输入,让WordPress知道 联系\u form\u脚本。php 需要加载脚本,这应该允许您加载整个wordpress core,并且仍然让您的自定义表单处理脚本处理数据:

    功能。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.
    }
    

    联系表格。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>
    

    同样,这并不理想,但我怀疑这正是你在寻找的时间点,这是朝着正确的方向迈出的一步。将代码保存在模板中。

        2
  •  1
  •   Nicholas Koskowski    8 年前

    更改以下内容

     mail($to, $subj, $msg, $headers);
    

    进入

    wp_mail($to, $subj, $msg, $headers);
    

    这将使WordPress正确地路由您的邮件。

    也作为一个整体。。。您应该使用wp\u 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');
    ?>
    
        3
  •  0
  •   Srivats Shankar    8 年前

    我们最近在联系方式上遇到了类似的问题。显然,这个问题不是由于我们的PHP出现了问题,而是因为共享托管策略发生了变化。当然,如果您使用的是VPS,这不会是一个问题。

    然而,如果您有任何形式的使用cPanel的共享主机和任何形式的基于脚本的电子邮件(包括联系表单7),这可能是一个潜在的解决方案。

    使用“纸灯笼”主题,选择“挂号邮件ID”选项,如下所示: link to choose

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

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