Контактная форма PHP не работает на Wordpress - PullRequest
0 голосов
/ 17 мая 2018

Я создал простую контактную форму php, используя mail (). Эта форма работала на моем сайте в течение многих лет.

Однако недавно я создал новый веб-сайт на 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 голосов
/ 17 мая 2018

Изменить следующее

 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');
?>
0 голосов
/ 17 мая 2018

Недавно мы столкнулись с похожей проблемой с нашей контактной формой.По-видимому, проблема была не в результате проблемы с нашим PHP, а скорее в изменении политики общего хостинга.Естественно, если вы используете VPS, это не будет проблемой.

Однако, если у вас есть какой-либо общий хостинг с использованием cPanel и любой формы электронной почты на основе сценариев (включая контактную форму 7), это может бытьпотенциальное решение.

Используя тему «бумажный фонарь», выберите опцию «ID зарегистрированной почты», как показано ниже: link to choose

Затем вы должны получить опциюдобавить дополнительные идентификаторы электронной почты.Просто введите свой идентификатор электронной почты, который вы используете в сценарии.Примерно через 8 часов ID должен был быть передан, и вы сможете использовать свой сценарий.

Надеюсь, это поможет!Нам потребовалось очень много времени, чтобы понять.

0 голосов
/ 17 мая 2018

В 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 submit, чтобы сообщить 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>

Опять же, это не идеально, но я подозреваю, что это то, что вы ищете в данный момент времени, и это шаг в правильном направлении. Хранение кода в шаблоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...