[英]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 );
}
}
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>
謝謝你的幫助!
以下是一些常規步驟。 請注意,這些只是示例,而不是完整的代碼。 您必須找到適合您情況的正確方法。
首先,在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
現在,您可以使用$my_form_data['fieldname']
來代替$_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();
});
});
希望這個例子對您使用插件有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.