なぜadmin-ajax.phpを使用するのですか?


9

jsonデータに対する私のajax呼び出しは、次のfunctions.phpのように機能します。

add_action( 'wp_ajax_nopriv_load-filter', 'prefix_load_cat_posts' );
add_action( 'wp_ajax_load-filter', 'prefix_load_cat_posts' );
function prefix_load_cat_posts () {
  //get data here
}

javascript:

var ajaxurl = 'http://'+window.location.host+'/wp-admin/admin-ajax.php';
jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    etc.

2つの質問があります。

1)jsonを別のファイルにthemes/example/json.phpエンコードしてデータをエンコードする代わりに、admin-ajax.phpを使用する理由は何ですか?

2)admin-ajax.phpはどのように機能しますか?そのファイルからはよくわかりません。すべての機能がロードされているので、すぐに使用できますか?

ありがとう!


2
注目themes/example/json.phpすべきことに、どの回答でも、なぜ主要なセキュリティの脆弱性と見なす必要があるかについて話します
Tom J Nowell

回答:


14

1)admin-ajax.phpjsonを別のファイルにエンコードする代わりにを使用して、themes/example/json.phpそこでデータをエンコードするのはなぜですか?

を使用admin-ajax.phpすると、WordPressコアがロードされて使用可能になります。それ以外の場合は、必要なファイルを手動でロードする必要があります。これは複雑なプロセスであり、コアを非常によく知らない場合は失敗する傾向があります。また、JavaScriptのセキュリティはどの程度優れていますか。

2)どのように機能しadmin-ajax.phpますか?そのファイルからはよくわかりません。すべての機能がロードされているので、すぐに使用できますか?

  1. WordPressコアをロードします。つまり、$wpdb およびのようなものを使用できます$WP_Query。それは約25行目です。
  2. 37〜41行目で、いくつかのヘッダーを送信します。
    1. コンテンツタイプヘッダー
    2. 結果をキャッシュしないようにブラウザに指示するヘッダー
    3. 興味深いヘッダーは、 send_nosniff_headers()
    4. nocache_headers()
  3. admin_initフック火災。
  4. コアアクションは動的に定義および登録されます(46行目から73行目)。これらは必要でない限り、つまり、$_GETまたはを介してリクエストされない限り、登録されません$_POST
  5. 「ハートビート」APIフックが起動する-75行目
  6. 要求しているユーザーの「ログイン」ステータスがチェックされ、適切な管理フックまたは「特権なし」フックが起動されます。

私の意見では、項目1と6はAJAX APIを使用する主な理由です。ほぼ確実に必要なWordPressコアがあり、他のWordPressと同じログインセキュリティシステムを持っています。


6

admin-ajax.phpWordPress AJAX APIの一部であり、はい、バックエンドとフロントの両方からのリクエストを処理します。ここで私はあなたの質問のために考え出したものです:

2)admin-ajax.phpはどのように機能しますか?

ロジックについては、こちらをご覧ください。

これは、JavaScriptなどをエンキューする方法をすでに知っていることを前提としています。

JavaScriptピース:

jQuery(document).ready(function($) {

    // We'll pass this variable to the PHP function example_ajax_request
    var fruit = 'Banana';

    // This does the ajax request
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // This outputs the result of the ajax request
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

PHPピース:

function example_ajax_request() {

    // The $_REQUEST contains all the data sent via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Let's take the data that was sent and do something with it
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Now we'll return it to the javascript function
        // Anything outputted will be returned in the response
        echo $fruit;

        // If you're debugging, it might be useful to see what was sent in the $_REQUEST
        // print_r($_REQUEST);

    }

    // Always die in functions echoing ajax content
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// If you wanted to also use the function for non-logged in users (in a theme for example)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1)なぜ、themes / example / json.phpのような別のファイルにjsonをエンコードする代わりにadmin-ajax.phpを使用して、そこにデータをエンコードするのですか?

これは役に立ちます。Ajaxリクエスト用のadmin-ajax.phpとカスタムページテンプレート


ねえ、これらのアクションフック 'wp_ajax_example_ajax_request'と 'wp_ajax_nopriv_example_ajax_request'について説明してもらえますか?どこにも説明がありません。また、ajaxurlは何に解決されますか?ありがとう
David Okwii
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.