PHP mail() 函数不通知 jQuery 成功/失败


PHP mail() function not notifying jQuery of success/failure

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

.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 );
    }
}

j查询:

<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>

感谢您的任何帮助!

以下是一些要遵循的通用步骤。请注意,这些是示例,而不是完整的代码。您必须找到正确的方法来将此信息应用于您的案例。

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

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

您必须对函数进行一些修改。首先,回声不会给出答复。但是让我们从头开始吧!在回调函数 invfr_sendmail 中,添加从 jQuery 接收表单的代码。由于它们以编码字符串的形式出现,我们必须在顶部解析它们:

$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']

在 PHP 代码的最后,您必须将 JSON 编码的回复发送到 jQuery。例如:

$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 发送表单并聆听答案。

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();
    });
});

希望这个例子能让你的插件走上正轨!