PHP mail()函数不会通知jQuery成功/失败 [英] PHP mail() function not notifying jQuery of success/failure

查看:54
本文介绍了PHP mail()函数不会通知jQuery成功/失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

PHP mail()循环正在运行,并且发送正确,没有错误。但是,我的jQuery无法正常工作,无法在前端通知成功或错误消息。

PHP mail() loop is running, and sending properly, with no errors. However, my jQuery isn't working, to notify either a success or error message on the front end.

PHP:

add_action( 'wp_ajax_invfr_process_ajax', 'invfr_sendmail');
add_action( 'wp_ajax_nopriv_invfr_process_ajax', 'invfr_sendmail');
function invfr_sendmail() {
    $post = ( !empty( $_POST ) ) ? true : false;

    if( $post ) {
        $subject = invfr_get_settings( 'subject' );
        $message = invfr_get_settings( 'message' );
        $friends = $_POST['friend_email'];
        $errors = array();
        foreach ( $friends as $key => $friend ) {
            $name = stripslashes( $_POST['friend_name'][$key] );
            $email = trim( $_POST['friend_email'][$key] );

            // Check name
            if( !$name )
                $errors[] = '#friend_name-' . $key;

            if( !$email )
                $errors[] = '#friend_email-' . $key;

            if( $email && !is_email( $email ) )
                $errors[] = '#friend_email-' . $key;
        }

        // send email 
        if( !$errors ) {
            foreach ( $friends as $key => $friend )
                $mail = wp_mail( $email, invfr_tokens_replacement( $subject, $_POST, $key ), invfr_tokens_replacement( $message, $_POST, $key ) );
            if( $mail )
                echo 'sent';
        }
        else
            echo json_encode( $errors );
    }
}

jQuery:

<script type="text/javascript"> 
            var jQuery = jQuery.noConflict();
            jQuery(window).load(function(){ 
                jQuery('#invfr_form').submit(function() {
                    // change visual indicators
                    jQuery('td').removeClass('error');
                    jQuery('.loading').show();
                    jQuery('.submit input').attr('disabled', 'disabled');
                    // validate and process form here
                    var str = jQuery(this).serialize();                  
                       jQuery.ajax({
                           type: 'POST',
                           url: '<?php echo admin_url( 'admin-ajax.php' ); ?>',
                           data: str,
                           success: function(msg) { 
                                jQuery('#invfr_note').ajaxComplete(function(event, request, settings) {
                                    msg = msg.replace(/(\s+)?.$/, "");  
                                    if( msg == 'sent' ) {
                                        result = '<div class="updated"><p><?php _e( 'Your invitation has been sent! Send another?', 'invfr' ); ?></p></div>';
                                        jQuery('#invfr_form input[type=text], #invfr_form input[type=email]').val('');
                                    } else {
                                        //loop through the error items to indicate which fields have errors
                                        msg = msg.replace(/[\[\]']+/g,'');
                                        msg = msg.split(',');
                                        jQuery.each( msg, function ( i, id ) {
                                            id = id.replace(/["']{1}/g, '');
                                            jQuery(id).parent('td').addClass('error');
                                        });
                                        result = '<div class="error"><p><?php _e( '<strong>ERROR:</strong> Check your form for the errors which are highlighted below.', 'invfr' ); ?></p></div>';
                                        //result = msg;
                                        msg = '';
                                    }
                                    jQuery(this).html(result);
                                    // visual indicators
                                    jQuery('.loading').hide();
                                    jQuery('.submit input').removeAttr('disabled');                      
                                });                  
                            }                    
                        });                  
                    return false;
                });         
            });
        </script>

感谢您的帮助!

推荐答案

以下是一些常规步骤。请注意,这些只是示例,而不是完整的代码。您必须找到适合您情况的正确方法。

Here are some generic steps to follow. Please note, these are examples, not complete code. You must find the correct ways to apply this information in your case.

首先,在WP中,将您的函数添加为ajax回调:

First, in WP, add your function as an ajax callback:

add_action ( 'wp_ajax_my_action', 'invfr_sendmail' ); 
// The AJAX command is 'my_action'

您必须在函数中进行一些修改。首先,在这里回荡事物不会得到答复。但是,让我们从头开始!在回调函数 invfr_sendmail 内,添加从jQuery接收表单的代码。由于它们是编码字符串,因此必须在顶部进行解析:

You must make some modifications in your function. For one, echoing things there won't give a reply. But let's start at the beginning! Inside your callback function invfr_sendmail, add the code that receives the form from jQuery. Since they come as an encoded string, we must parse them on the top:

$my_form_data = array(); // Create an empty array
parse_str( $_POST['my_form_data'], $my_form_data ); // Fills $my_form_data

现在,而不是使用 $ _ POST ['fieldname '] ,则使用 $ my_form_data ['fieldname']

Now, instead of using $_POST['fieldname'], you use $my_form_data['fieldname'].

在PHP代码末尾,您必须将JSON编码的回复发送给jQuery。例如:

In the end of your PHP code, you must send the JSON encoded replies to jQuery. For example:

$success = true;
$errors = array( 'This one was wrong', 'That one too' );
$some_other_value = false;
// Put these variables in an array
$results = compact( 'success', 'errors', 'some_other_value' ); 
wp_send_json( $results );

通过AJAX发送表单并听取答案。

Send your form via AJAX and listen for the answer.

jQuery('form#my_form_name').on('submit', function(event){
    event.preventDefault(); // Stops the form from being submitted via POST
    var data = {
        command: 'my_action', // The same name you used in WP 'add_action' above
        my_form_data: jQuery('form#my_form_name').serialize()
    };
    jQuery('.loading').show();
    jQuery.ajax({ 
        type: 'POST',
        url: ajaxurl,
        data: data
    }).done( function( response ) {
        // This runs when the server replies something
        if (response.success) {
            // This corresponds to the $success variable we set  
            jQuery('#someElement').html('The operation was a success!')
        }
        if (response.errors) {
            // This would be the $errors array from PHP
            response.errors.each( function(errorMessage) {
                jQuery('#someElement').append( errorMessage );
            } );
        }
        if (response.some_other_value) {
            // Here nothing happens if $some_other_value in PHP was false
        }
    }).fail( function( jqXHR, textStatus, errorThrown ) {
        // This runs when the request fails (i.e. timeout)
        jQuery('#someElement').html( 'The AJAX request failed with error message ' + errorThrown ); 

    }).always( function() {
        // This runs always after an AJAX request, even a failed one
        jQuery('.loading').hide();
    });
});

希望这个示例可以很好地帮助您使用插件!

Hope this example will set you well on your way with your plugin!

这篇关于PHP mail()函数不会通知jQuery成功/失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆