送信ボタンを押したときにWordPressの投稿のユーザーの入力を検証し、エラーメッセージを表示して問題があり、すべてがOKならフォームを送信します。 form_data
のデータがOKならば、true
を返して、それ以外の場合はエラーコードを返すチェックを行うPHP関数があります。次のJavaScriptは、AJAXリクエストを発行し、成功したチェック時にフォームを送信し続けることになっていたが、それはしていません: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 question、から構成されていますフォームは提出されませんでした。私は、.submit()
にバインドされたjQuery関数がtrueを返す場合、フォームを送信する必要があることを知ったので、実装しようとしました。上記のコードでは、最初は機能していないようです(エラーがない場合はフォームは送信されません)。しかし、Firebugを使って詳細に検査すると、return proceed
行にブレークポイントが挿入されていると正しい結果が得られるようです。これは、有効なデータで意図したとおりに動作しますが、ブレークポイントに達すると少し待ってから実行を続けるとになります。エラーが発生した場合、アラートは問題なく発行されます。
これを処理する最善の方法は何ですか?
@Linusに基づいて
EDITは以下の答え、次のコードは、有効および無効なデータの両方で動作します:
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;
});
});
素晴らしいソリューション!最初はちょっと苦労しましたが、後でWordPressでjQueryが '$'ではなく 'jQuery'と呼ばれなければならないので、うまくいきませんでした。 – englebip
Wow、あなたはちょうど私のリビングルームのウィンドウを保存しました。そして最後の忍耐の細断。私は、なぜajaxイベントがブロックできないのか理解できず(そしてまだしていない)、完了を知らせて、通常のフォーム処理を実行できるようにしました。これはうまくいきましたが、私はこのシナリオがなぜこれをテストする力がなくなったのかわかりません。 – eggmatters