Warum admin-ajax.php verwenden und wie funktioniert es?

9

Mein Ajax-Aufruf für JSON-Daten funktioniert wie folgt.

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.

Ich habe 2 Fragen.

1) Warum sollten Sie admin-ajax.php verwenden, anstatt Ihren json in einer separaten Datei zu themes/example/json.phpcodieren und Ihre Daten dort zu codieren?

2) Wie funktioniert admin-ajax.php? Ich verstehe nicht viel aus dieser Datei. Lädt es alle Funktionen, damit Sie sie verwenden können?

Vielen Dank!

Claudiu Creanga
quelle
2
Zu beachten ist, dass jede Antwort darüber sprechen würde, warum themes/example/json.phpdies als große Sicherheitslücke angesehen werden sollte
Tom J Nowell

Antworten:

14

1) Warum sollten Sie admin-ajax.phpIhren JSON verwenden, anstatt ihn in einer separaten Datei zu themes/example/json.phpcodieren, und Ihre Daten dort codieren?

Verwenden admin-ajax.phpbedeutet, dass der WordPress Core geladen und verfügbar ist. Ohne dies müssten Sie die benötigten Dateien von Hand laden. Dies ist ein komplizierter Prozess und fehleranfällig, wenn Sie den Core nicht sehr, sehr gut kennen. Und wie gut sind Sie mit Javascript-Sicherheit?

2) Wie funktioniert das admin-ajax.php? Ich verstehe nicht viel aus dieser Datei. Lädt es alle Funktionen, damit Sie sie verwenden können?

  1. Es lädt den WordPress Core, was bedeutet, dass Sie Dinge wie $wpdb und verwenden können $WP_Query. Das ist ungefähr in Zeile 25.
  2. Es werden einige Überschriften gesendet - Zeilen 37 - 41.
    1. Ein Inhaltstyp-Header
    2. Ein Header, der den Browsern anweist, die Ergebnisse nicht zwischenzuspeichern
    3. Die interessanten Header sind die von send_nosniff_headers()
    4. und nocache_headers().
  3. Der admin_initHaken feuert.
  4. Kernaktionen werden dynamisch definiert und registriert - Zeilen 46 - 73. Diese werden nur registriert, wenn sie benötigt werden - das heißt, wenn sie nicht über $_GEToder angefordert werden $_POST.
  5. Der "Heartbeat" -API-Hook wird ausgelöst - Zeile 75
  6. Der Status "angemeldet" des anfordernden Benutzers wird überprüft und der entsprechende administrative oder "kein Privileg" -Hook wird ausgelöst.

Die Punkte 1 und 6 sind meiner Meinung nach die Hauptgründe für die Verwendung der AJAX-API. Sie haben den WordPress Core, den Sie mit ziemlicher Sicherheit benötigen, und Sie haben das gleiche Anmeldesicherheitssystem wie der Rest von WordPress.

s_ha_dum
quelle
6

admin-ajax.phpist Teil der WordPress AJAX-API und verarbeitet Anfragen sowohl vom Backend als auch vom Frontend. Hier ist, was ich für Ihre Frage herausfinde:

2) Wie funktioniert admin-ajax.php?

Für die Logik können Sie hier besuchen.

Dies setzt voraus, dass Sie bereits wissen, wie Sie JavaScript usw. in die Warteschlange stellen.

JavaScript-Stück:

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-Stück:

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) Warum sollten Sie admin-ajax.php verwenden, anstatt Ihren json in einer separaten Datei wie theme / example / json.php zu codieren und Ihre Daten dort zu codieren?

kann dies hilfreich sein. admin-ajax.php vs Benutzerdefinierte Seitenvorlage für Ajax-Anfragen

Sohan
quelle
Hey, kannst du diese Action-Hooks 'wp_ajax_example_ajax_request' und 'wp_ajax_nopriv_example_ajax_request' erklären? Ich finde nirgendwo eine Erklärung. Auch was löst Ajaxurl auf? Thanks
David Okwii vor