他のプログラマが抱えている問題を見つけ出そうとしています。管理者側のAJAXを実行するときにfunctions.php
ファイルがまったく呼び出されるのではないかと思いましたか? AJAXを呼び出すと、WPの一部が呼び出され、その呼び出しを処理して応答を返すことがわかります。 functions.php
ファイルはそれに含まれていますか?
私が求めているのは、彼がMeta-Box`プラグインのクラスを使っていて、代わりにそれをテーマの一部として読み込んでいるからです。そのクラスには空の応答のみを返すAJAXがあります。応答を処理するコードがロードされないためだと思います。 WPがAJAXを処理したときに何が読み込まれるのかに関するドキュメントはありますか?
admin-ajax.php
はwp-load.php
をロードします。
/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );
wp-load.php
はwp-config.php
をロードし、そこでwp-settings.php
がロードされます。
そしてここで我々はこれを見つける:
// Load the functions for the active theme, for both parent and child theme if applicable.
if ( ! defined( 'WP_INSTALLING' ) || 'wp-activate.php' === $pagenow ) {
if ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )
include( STYLESHEETPATH . '/functions.php' );
if ( file_exists( TEMPLATEPATH . '/functions.php' ) )
include( TEMPLATEPATH . '/functions.php' );
}
そう、はい、テーマのfunctions.php
がロードされています。
wp-settings.php
には例外が1つあります。
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
SHORTINIT
が以前にTRUE
として定義されている場合、テーマはロードされません。
そのため、何らかの理由でSHORTINIT
がTRUE
であるかどうかを確認してください。
もう1つの一般的なエラーは、is_admin()
の使い方が間違っていることです。これはadmin-ajax.php
では常にTRUE
なので、以下は失敗します。
if ( ! is_admin() )
// register or execute AJAX stuff
最も原始的な方法の1つは、AJAXをデバッグするためにHTTPヘッダーを使用することです。
これが単純なヘルパー関数です。
function send_debug_header( $msg )
{
static $counter = 1;
header( "X-Debug-Ajax-$counter: $msg" );
$counter += 1;
}
そしてこのプラグインはその使い方を示しています。
<?php # -*- coding: utf-8 -*-
/**
* Plugin Name: Debug AJAX per HTTP
* Description: Look at the HTTP headers in your browser's network console
*/
// The constant is already defined when plugins are loaded.
// Prove we have been called.
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
send_debug_header( 'File "' . __FILE__ . '" was called on an AJAX request.' );
function send_debug_header( $msg )
{
static $counter = 1;
header( "X-Debug-Ajax-$counter: $msg" );
$counter += 1;
}
add_action( 'wp_ajax_debug_test', 't5_debug_test' );
add_action( 'wp_ajax_nopriv_debug_test', 't5_debug_test' );
function t5_debug_test()
{
$in = is_user_logged_in() ? '' : 'not ';
send_debug_header( 'Function "' . __FUNCTION__ . '" was called and the user is ' . $in . 'logged in.' );
print_r( debug_backtrace() );
die(1);
}
add_action( 'wp_enqueue_scripts', 't5_enqueue_jquery' );
function t5_enqueue_jquery()
{
wp_enqueue_script( 'jquery' );
}
add_action( 'wp_footer', 't5_debug_ajax_test_button', 0 );
function t5_debug_ajax_test_button()
{
?>
<input type="submit" id="t5debugajax" value="Debug AJAX">
<script>
jQuery( function($){
var sendFeedBack = function( response ){
console.log( response );
};
$("#t5debugajax").on("click", function(){
$.post(
"<?php echo admin_url( 'admin-ajax.php' ); ?>",
{
action: "debug_test"
},
sendFeedBack
);
});
});
</script>
<?php
}
クリックするとAJAXリクエストをトリガーするボタンがフロントエンドに追加されます。ブラウザのネットワークコンソールを開き、リクエストのレスポンスヘッダを調べます。
私はあなたの問題がAJAXがあなたがログインしていて、それがログアウト状態で働いていなかったならば働いていたと思いましたね。
WordPressには、ログインしていないユーザーのためにAJAXベースのファイルにアクセスする機能があります。例えば、wp_ajax_nopriv
です。
/* works for logged users */
add_action( 'wp_ajax_my_action', 'my_action_callback');
/* works for non logged users */
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback');