Я хочу проверить пользовательские записи в сообщении WordPress после нажатия кнопки «Отправить», отобразить сообщение об ошибке, если есть проблемы, и отправить форму, если все в порядке.У меня есть функция PHP, которая выполняет проверку, возвращая true
, если данные в form_data
в порядке, в противном случае код ошибки.Следующий JavaScript выполняет запрос AJAX и должен был продолжить отправку формы после успешной проверки, но это не так:
jQuery(document).ready(function() {
jQuery('#post').submit(function() {
var form_data = jQuery('#post').serializeArray();
var data = {
action: 'ep_pre_submit_validation',
security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
form_data: jQuery.param(form_data),
};
var proceed = false;
jQuery.post(ajaxurl, data, function(response) {
if (response.indexOf('true') > -1 || response == true) {
proceed = true;
} else {
alert("Error: " + response);
proceed = false;
}
});
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
return proceed; //breakpoint here makes the code run
});
});
Код адаптирован из WPSE вопроса ,который изначально не работал для меня, так как форма не была отправлена.Я обнаружил, что если функция jQuery, связанная с .submit()
, возвращает true, форма должна быть отправлена, поэтому я попытался реализовать ее.С приведенным выше кодом, кажется, сначала не работает (форма не отправляется, когда нет ошибок), но при тщательном рассмотрении с Firebug proceed
, кажется, дает правильный результат, если точка останова вставлена вreturn proceed
строка.Он работает, как и предполагалось, с действительными данными только , если я немного подожду после достижения точки останова, а затем продолжу выполнение.Если есть ошибки, предупреждение выдается без проблем.
Каков наилучший способ справиться с этим?
РЕДАКТИРОВАТЬ
Основываясь на ответе @Linus ниже, следующий код работает как с действительными, так и с недействительными данными:
jQuery(document).ready(function() {
jQuery('#post').submit(function() {
if(jQuery(this).data("valid")) {
return true;
}
var form_data = jQuery('#post').serializeArray();
var data = {
action: 'ep_pre_submit_validation',
security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
form_data: jQuery.param(form_data),
};
jQuery.post(ajaxurl, data, function(response) {
if (response.indexOf('true') > -1 || response == true) {
jQuery("#post").data("valid", true).submit();
} else {
alert("Error: " + response);
jQuery("#post").data("valid", false);
}
//hide loading icon, return Publish button to normal
jQuery('#ajax-loading').hide();
jQuery('#publish').removeClass('button-primary-disabled');
});
return false;
});
});