あるJSファイルがajax呼び出しを行っています。このAjax呼び出しの成功の中で、別のAJAX呼び出しが行われます。 2回目の呼び出しでは、電子メールがすでに登録されているかどうかを確認します。その場合、2回目のAJAX呼び出しでは、FirebugおよびChromeコンソールに示されているように返されたデータは受信されません。しかし、前述の問題はオンラインサーバーでのみ発生しますが、同じコードはlocalhostでも問題なく動作します。
ホストされているページはhttp://twmobilefitness.com/signup/
です。最後に '今すぐ登録' リンクをクリックすると問題が発生します。問題が発生したい場合は、同じ電子メールアドレスで2回登録する必要があります。
JS:
$.ajax( {
url : base_url+"/wp-admin/admin-ajax.php",
type : 'GET',
cache : false,
data : 'action=check_user_name&'
+ Math.floor( ( Math.random() * 100 ) +1 )
+ '&user_name='+user_name,
success : function( result ) {
if ( parseInt( result ) == 0 ) {
$( ".result" ).html( '<span class="error">User name not available </span>' );
} else if ( parseInt( result ) == 1 ) {
$.ajax( {
url : base_url
+ "/wp-admin/admin-ajax.php",
type : 'GET',
cache : false,
data : 'action=check_email_used&'
+ Math.floor( ( Math.random() *100 ) +1 )
+ '&email=' + email,
success : function( result_email ) {
if ( parseInt( result_email ) == 0 ) {
$( ".result" ).html( '<span class="error">Email already used </span>' );
} else if ( parseInt( result_email ) == 1 ) {
$( ".result" ).html( '' );
$( ".signup_div" ).hide();
$( ".signup_emergency_contact" ).show();
}
}
} );
}
}
} );
functions.php
は
add_action('wp_ajax_check_user_name','check_user_name');
add_action('wp_ajax_nopriv_check_user_name','check_user_name');
add_action( 'wp_ajax_check_email_used','check_email_used' );
add_action( 'wp_ajax_nopriv_check_email_used','check_email_used' );
function check_user_name() {
global $wpdb;
$user_name = trim( $_GET['user_name'] );
$MobTraining = new MobTraining();
$table =trim( "{$wpdb->prefix}users" );
$array_where['user_login'] = $user_name;
$sql_fetch = $MobTraining->fetch( $table, $array_where );
$row = $wpdb->get_results( $sql_fetch, ARRAY_A );
if ( sizeof( $row ) != 0 ) {
echo '0';
} else {
echo '1';
}
die();
}
function check_email_used() {
global $wpdb;
$email = trim( $_GET['email'] );
$MobTraining = new MobTraining();
$table = trim( "{$wpdb->prefix}users" );
$array_where['user_email'] = $email;
$sql_fetch = "SELECT * FROM $table WHERE `user_email`='$email'";
$row = $wpdb->get_results( $sql_fetch, ARRAY_A );
if ( sizeof( $row ) != 0 ) {
echo '0';
} else {
echo '1';
}
die();
}
オンラインサーバーでコードを機能させる方法は?
あなたが経験していること(AJAXはローカルでは動作しますが、サーバーでは動作しません)には遅延の問題があります。ローカルではすべてが高速に動作しますが、それはできませんseeあなたの問題。要するに、これはあなたの問題です:
AJAXコールバック(A)が実行されます> AJAXコールバック(B)は待機する必要があることを認識していません(A)>(A)も終了しているため、ローカルインストールで問題を確認できません速い。
そのため、コールバック(B)に(A)を待つ必要があることを伝える方法を見つける必要があります。方法は次のとおりです。
データを正しい方法で登録およびエンキューおよびローカライズする:関数またはメソッドにラップして、wp_enqueue_scripts
(public/themes)、login_enqueue_scripts
(password/login/register)、またはadmin_enqueue_scripts
にフックします。 wp_localize_script()
を使用して、データをPHPからJSに移動し、そこでアクセス可能にします。
add_action( 'admin_enqueue_scripts', 'wpse118772jsObject' );
function wpse118772jsObject()
{
$scriptHandle = 'custom-script-name';
// Should be divided into separate functions or methods
wp_register_script(
$scriptHandle,
plugins_url( __FILE__, 'your/path' ),
array( 'jquery' ),
plugin_dir_path( __FILE__ ).'your/path' ),
true
);
wp_enqueue_script( $scriptHandle );
wp_localize_script(
$scriptHandle,
'pluginObject',
array(
'ajaxURl' => admin_url( 'admin_ajax.php' ),
'custom' => array(
// custom data in here
),
),
);
}
使用できる関数はいくつかあります。 デフォルト$.ajax({});
関数 またはそのショートカット$.post();
、$.getJSON();
など。
したがって、次のようなものを使用できます-success/fail
オブジェクトメソッドを使用します。
( function( $, plugin ) {
"use strict";
$.ajax( {
url : plugin.ajaxURl,
data : {
// other data
},
// We assume you're responding with a proper wp_send_json_success/error() in the PHP Cb.
dataType : "json",
// Request transformation possible in here.
beforeSend : function( xhr ) {
// Example:
// xhr.overrideMimeType( 'application/json' );
},
// The actual handlers
success : function( data, textStatus, jqXHR ) {
// Handle data transformation or DOM manipulation in here.
},
error : function( jqXHR, textStatus, errorThrown ) {
// silent: Log the error
console.info( errorThrown );
// loud: Throw Exception
throw errorThrown;
}
} );
} )( jQuery, pluginObject || {} );
さらに詳しくそして本当に正しい方法でしたい場合は、メソッドチェーンを使用する必要があります。 (まだ改善の余地があります)。
( function( $, plugin ) {
"use strict";
$.ajax( {
url : plugin.ajaxURl,
data : {
// other data
},
} )
.done( function( data ) {
// Handles successful responses only
} )
.fail( function( reason ) {
// Handles errors only
console.debug( reason );
} )
.always( function( data, textStatus, response ) {
// If you want to manually separate stuff
// response becomes errorThrown/reason OR jqXHR in case of success
} )
.then( function( data, textStatus, response ) {
// In case your working with a deferred.promise, use this method
// Again, you'll have to manually separates success/error
} );
} )( jQuery, pluginObject || {} );
注:コールバックのラッパーのより良い例については、 commonjsまたはAMD とその違いをご覧ください。
興味深い-そしてjQuery(およびその他のライブラリ)全体の中で最も強力な部分AJAX処理-問題は、wait untilAが終了してから開始Bおよびその処理。答えは「遅延」ローディングと「約束」です。
簡単な例を追加します。 this.
を介してオブジェクトに追加することで、ビルドとオブジェクトを分離し、内容を分離することを検討する必要がありますが、例としては以下で十分です。
例(A)これは基本的に私がやるようなものです。あなた自身のビットを埋める必要があります。
( function( $, plugin ) {
"use strict";
$.when(
$.ajax( {
url : pluginURl,
data : { /* ... */ }
} )
.done( function( data ) {
// 2nd call finished
} )
.fail( function( reason ) {
console.info( reason );
} )
)
// Again, you could leverage .done() as well. See jQuery docs.
.then(
// Success
function( response ) {
// Has been successful
// In case of more then one request, both have to be successful
},
// Fail
function( resons ) {
// Has thrown an error
// in case of multiple errors, it throws the first one
},
);
} )( jQuery, pluginObject || {} );
例(B)このように試したことはありませんが、shouldも機能します。読みやすくなりましたが、$.when()
解決済みのプロミスがもっと好きです。
( function( $, plugin ) {
"use strict";
$.ajax( {
url : plugin.ajaxURl,
data : {
// other data
}
} )
.done( function( data ) {
// Handles successful responses only
} )
.fail( function( reason ) {
console.info( reason );
} )
// Promise finished:
.then( function( data ) {
$.ajax( {
url : pluginURl,
data : { /* ... */ }
} )
.done( function( data ) {
// 2nd call finished
} )
.fail( function( reason ) {
console.info( reason );
} );
} );
} )( jQuery, pluginObject || {} );
さらに詳しく知りたい場合は、 deferred
およびthen
に関するドキュメント をお読みください。
別のAJAXリクエストを終了した後に1つのAJAXリクエストを実行するには、以下の1行を追加する必要があります。
async:false、
つまり、以下のようにajaxメソッドにasync: false
を追加する必要があります。
$。ajax({ url:base_url + "/ wp-admin/admin-ajax.php"、 タイプ: 'GET'、 async:false 、