AJAX联系人表单未提交消息

时间:2020-03-16 作者:sialfa

我正在处理一份联系表格,但遇到了一些问题。我正在使用ajax提交它,我注意到,从localhost和生产服务器,我发送的测试消息将不会被传递。我不确定这是网络延迟还是因为我使用的是wordpress nonces。

这是代码,我正在验证nonce,就像没有ajax的普通post请求一样,不会记录任何错误,但不会发送任何消息。请帮帮我。

HTML:

      <form method="POST" action="<?php echo esc_url(admin_url(\'admin-ajax.php\')); ?>" id="message-form">
        <div class="form-row mb-3">
          <div class="col-sm-12 col-md-6 col-lg-6">
            <input type="text" class="form-control" id="" name="fname" placeholder="<?php _e(\'Nome\'); ?>" required />
          </div>
          <div class="col-sm-12 col-md-6 col-lg-6">
            <input type="text" class="form-control" id="" name="lname" placeholder="<?php _e(\'Cognome\'); ?>" required />
          </div>
          <div class="col-sm-12 col-md-6 col-lg-6">
            <input type="text" class="form-control" id="" name="phone" placeholder="<?php _e(\'Numero\'); ?>" required />
          </div>
          <div class="col-sm-12 col-md-6 col-lg-6">
            <input type="email" class="form-control" id="" name="email" placeholder="<?php _e(\'Email\'); ?>" required />
          </div>
          <div class="col-sm-12 col-md-12 col-lg-12">
            <input type="text" class="form-control" id="" name="subject" placeholder="<?php _e(\'Oggetto\'); ?>" required />
          </div>
          <div class="col-sm-12 col-md-12 col-lg-12">
            <textarea class="form-control" name="message" placeholder="<?php _e(\'Messaggio\'); ?>" required></textarea>
          </div>
        </div>
        <input type="hidden" name="action" value="send_message">
        <?php wp_nonce_field(\'send_message\', \'message_hash\'); ?>
        <a href="#" class="section-link hide" id="submit-form"><?php _e(\'Invia\'); ?></a>
      </form>
JS公司:

  $(\'#submit-form\').on(\'click\', function(e){
    e.preventDefault();
    var data = $(\'#message-form\').serialize();
    $.ajax({
      type: \'POST\',
      url: wpcf.ajaxurl,
      data: data,
      success: function(response){
        $(\'#message-notice\').css({\'display\':\'block\'});
        $(\'#message-form\')[0].reset();
        setTimeout(function(){
          $(\'#message-notice\').css({\'display\':\'none\'});
        }, 3000);
        console.log(\'Done!\');
      }
    });
  });
PHP:

  /**
   * Form contatti front-end
   */
   function submit_contact_form()
   {
     if( !isset($_POST[\'message_hash\']) || !wp_verify_nonce( $_POST[\'message_hash\'], \'submit_message\' ) ){
       echo \'Errore\';
       exit;
     }
     // Customer contacts and message
     $email = sanitize_email($_POST[\'email\']);
     $fname = sanitize_text_field($_POST[\'fname\']);
     $lname = sanitize_text_field($_POST[\'lname\']);
     $phone = sanitize_text_field($_POST[\'phone\']);
     $subject = sanitize_text_field($_POST[\'subject\']);
     $message = "Hai ricevuto un nuovo messaggio da: $fname $lname \\n";
     $message .= "Puoi contattare l\'utente utilizzando il numero:  $phone \\n";
     $message .= "Testo del messaggio: \\n";
     $message .= sanitize_textarea_field($_POST[\'message\']);
     // send ticket
     $to = \'[email protected]\';
     $headers[] = "From: $fname $lname <$email>";
     wp_mail( $to, $subject, $message, $headers );
   }
   add_action( \'wp_ajax_send_message\', \'submit_contact_form\' );
   add_action( \'wp_ajax_nopriv_send_message\', \'submit_contact_form\' );

注意:我已经以这种方式在功能文件中本地化了脚本,我不确定这是否会有问题,但我已经为仪表板小部件本地化了ajax url,它不会工作,但在其他网站上工作得很好:

  function _res(){
    wp_enqueue_style(\'style\', get_template_directory_uri().\'/style.min.css\');
    wp_register_script(\'main\', get_template_directory_uri().\'/assets/js/main.js\', array(\'jquery\'), null );
    $localize = array(
       \'ajaxurl\' => admin_url(\'admin-ajax.php\'),
    );
    wp_localize_script(\'main\', \'wpcf\', $localize);
    wp_enqueue_script(\'main\');
  }
  add_action(\'wp_enqueue_scripts\', \'_res\');

1 个回复
SO网友:Mikhail

关于发送电子邮件:

wp\\u mail默认使用默认PHP的邮件设置,PHP默认使用sendmail服务,因此如果您在localhost上没有一个功能,您将无法发送电子邮件,您可以使用类似MailHog的东西来捕获在localhost上为您发送的电子邮件,并且您实际上将能够看到这些消息,这是一个非常好的调试选项。

在实时网站上,主机公司通常只是禁用sendmail 因为他们不希望自己的IP地址被列入黑名单,因为可能是来自客户托管站点的垃圾邮件。因此,您可以做的是安装https://wordpress.org/plugins/wp-mail-smtp/ 插件并使用您自己的gmail帐户发送电子邮件,以测试它是否正常工作。但对于生产使用,最好还是使用一些邮件发送服务,如MailGun\\SendGrid等。虽然这些服务是付费的,但它们会为您解决大量邮件发送的问题。

让我们深入了解如何改进代码,以便帮助您诊断发生了什么。

首先,如果您制作了一个ajax处理程序,那么最好通过以下方式将数据发送回jswp_send_json_success()wp_send_json_error() 功能使您的$。ajax将转到.done() 只有当您返回了HTTP代码为200的成功响应时,它才会转到.fail() 如果php代码返回错误。

让我们看看ajax处理程序的样子。

/**
 * Form contatti front-end
 */
function submit_contact_form() {
    if ( ! isset( $_POST[\'message_hash\'] ) || ! wp_verify_nonce( $_POST[\'message_hash\'], \'submit_message\' ) ) {
        wp_send_json_error( array( \'error\' => \'wrong_nonce\' ) );
        exit;
    }
    // Customer contacts and message
    $email    = sanitize_email( $_POST[\'email\'] );
    $fname    = sanitize_text_field( $_POST[\'fname\'] );
    $lname    = sanitize_text_field( $_POST[\'lname\'] );
    $phone    = sanitize_text_field( $_POST[\'phone\'] );
    $subject  = sanitize_text_field( $_POST[\'subject\'] );
    $message  = "Hai ricevuto un nuovo messaggio da: $fname $lname \\n";
    $message .= "Puoi contattare l\'utente utilizzando il numero:  $phone \\n";
    $message .= "Testo del messaggio: \\n";
    $message .= sanitize_textarea_field( $_POST[\'message\'] );
    // send ticket
    $to        = \'[email protected]\';
    $headers[] = "From: $fname $lname <$email>";
    $mail_result = wp_mail( $to, $subject, $message, $headers );
    if( $mail_result ) {
        wp_send_json_success([\'message\'=>\'mail_sent\']);
    }else {
        wp_send_json_error([\'error\'=>\'email_sending_error\']);
    }
}
add_action( \'wp_ajax_send_message\', \'submit_contact_form\' );
add_action( \'wp_ajax_nopriv_send_message\', \'submit_contact_form\' );
和JS代码,它们将优雅地处理数据,以避免盲目地相信如果数据被发送,它们就会被处理。

$(\'#submit-form\').on(\'click\', function(e){
    e.preventDefault();
    var data = $(\'#message-form\').serialize();
    $.ajax({
        type: \'POST\',
        url: wpcf.ajaxurl,
        data: data,
    }).done(function handleAjaxSuccess(response){
        console.log(\'success\', response);
        $(\'#message-notice\').css({\'display\':\'block\'});
        $(\'#message-form\')[0].reset();
        setTimeout(function(){
            $(\'#message-notice\').css({\'display\':\'none\'});
        }, 3000);
        console.log(\'Done!\');
    }).fail(function handleAjaxError(jqXhr,errorText){
        console.warn(\'Error\'); // just for you to see what\'s going on, here you can also display some error message to user.
        console.warn(errorText);
        console.warn(jqXhr);
    });
});
我使用了命名的js函数,因此在发生错误时,您可以更好地了解错误发生的位置,而不是依赖js匿名函数。

还有一个本地化脚本的小编辑:最好先让脚本排队,然后再本地化它。

wp_enqueue_script(\'main\');
wp_localize_script(\'main\', \'wpcf\', $localize);
您还可以将其简化为:

function _res() {
    wp_enqueue_style( \'my-plugin-style\', get_template_directory_uri() . \'/style.min.css\' );
    wp_enqueue_script( \'my-plugin-main\', get_template_directory_uri() . \'/assets/js/main.js\', array( \'jquery\' ), null, true );
    wp_localize_script(
        \'my-plugin-main\',
        \'wpcf\',
        array(
            \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
        )
    );
}
add_action( \'wp_enqueue_scripts\', \'_res\' );
另外,不要忘记为正在链接的css和js设置唯一的句柄名称,因为main 是非常广泛的东西,您可以覆盖其他插件的js\\css代码链接或wp core。这绝对不是我们想要做的事情。

在做了这些更改之后,您将能够诊断浏览器控制台中发生了什么,并看到php返回给您的消息。

相关推荐

生成元素的PHP代码在哪里?

当我对网站上某些元素的CSS/HTML/JS感兴趣时,我会预览它并在浏览器devtools中测试修改。我在这里很清楚。在PHP中是如何实现的?我在WordPress上有一个页面,我对一些元素感兴趣。我想知道生成这个元素的PHP代码在哪里。然后我想修改此代码并查看更改。最聪明的方法是什么?我知道我需要设计->主题编辑器中的文件。我也使用儿童主题。我在函数中实现了一些JS脚本。php。现在我感兴趣的是,例如,在主收藏和单个帖子中包含作者信息的元素。或者另一个问题:在编辑文章时,我们有“作者”字段。另一种