functions.phpファイルはAJAX呼び出し中に呼び出されますか?AJAXをデバッグする


23

仲間のプログラマーが抱えている問題を解明しようとしています。functions.php管理側のAJAXを実行するときにファイルが呼び出されるのかどうか疑問に思っていましたか?AJAX呼び出しを行うと、WPの一部が読み込まれて呼び出しを処理し、応答を返すことがわかります。functions.phpファイルはその中に含まれていますか?

私が尋ねている理由は、彼がMeta-Box`プラグインのクラスを使用し、代わりにテーマの一部としてロードしているためです。そのクラスには空の応答のみを返すAJAXがあり、応答を処理するコードが読み込まれないためだと思います。WPがAJAXを処理するときにロードされるものに関するドキュメントはありますか?

回答:


28

admin-ajax.php負荷wp-load.php

/** Load WordPress Bootstrap */
require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );

wp-load.phpロードしwp-config.phpwp-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がロードされます。


には1つの例外がありますwp-settings.php

// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
    return false;

ときSHORTINITのように定義されるTRUE以前、テーマはロードされません。

その場合はチェックしSHORTINITているTRUEいくつかの理由。


別の一般的なエラーは、の誤った使用法ですis_admin()。これは常にTRUEadmin-ajax.phpあるため、以下は失敗します。

if ( ! is_admin() )
    // register or execute AJAX stuff

AJAXのデバッグ

プリミティブとして効率的な方法の1つは、HTTPヘッダーを使用してAJAXをデバッグすることです。

簡単なヘルパー関数を次に示します。

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要求をトリガーするボタンがフロントエンドに追加されます。ブラウザのネットワークコンソールを開き、リクエストのレスポンスヘッダーを確認します。

ここに画像の説明を入力してください


いつものように、@ toscho。コードがあなたの側で正常に実行されるが、他の誰かのためではない場合、デバッグするのは特に困難です。問題を再現することはできませんが、あなたの答えはおそらく正しい方向に私を送信します。
マニーフルーモンド

@MannyFleurmondデバッグヘルパープラグインを追加しました。問題を見つけるのに役立つはずです。
FUXIA

9
男、あなたは徹底的です:)
マニー・フルーモンド

TEMPLATEPATH?;)
kaiser

1

あなたの問題は、あなたがログインしていてログアウト状態で動作していなかった場合、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');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.