Dlaczego warto korzystać z admin-ajax.php i jak to działa?

9

Moje wywołanie ajax dla danych JSON działa tak, jak to działa. 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.

Mam 2 pytania

1) Dlaczego warto korzystać z admin-ajax.php zamiast themes/example/json.phpkodować plik Json w osobnym pliku, np. I kodować tam dane?

2) Jak działa admin-ajax.php? Nie rozumiem wiele z tego pliku. Czy ładuje wszystkie funkcje, abyś mógł z nich korzystać?

Dzięki!

Claudiu Creanga
źródło
2
Warto zauważyć, że każda odpowiedź mówiłaby o tym, dlaczego themes/example/json.phpnależy uznać ją za poważną lukę w zabezpieczeniach
Tom J Nowell

Odpowiedzi:

14

1) Dlaczego warto korzystać admin-ajax.phpzamiast kodowania pliku Json w osobnym pliku, takim jak themes/example/json.phpi kodowanie tam danych?

Używanie admin-ajax.phpoznacza, że ​​WordPress Core jest załadowany i dostępny. Bez tego musisz ręcznie załadować potrzebne pliki, co jest skomplikowanym procesem i podatnym na awarie, jeśli nie znasz bardzo dobrze rdzenia. A jak dobry jesteś w zakresie bezpieczeństwa Javascript?

2) Jak admin-ajax.phpdziała? Nie rozumiem wiele z tego pliku. Czy ładuje wszystkie funkcje, abyś mógł z nich korzystać?

  1. Ładuje rdzeń WordPress, co oznacza, że ​​możesz używać takich rzeczy jak $wpdb i $WP_Query. To jest około linii 25.
  2. Wysyła kilka nagłówków - linie 37 - 41.
    1. Nagłówek typu zawartości
    2. Nagłówek informujący przeglądarki, aby nie buforowały wyników
    3. Interesującymi nagłówkami są te wysłane przez send_nosniff_headers()
    4. a nocache_headers().
  3. Te admin_initpożary haka.
  4. Akcje podstawowe są definiowane i rejestrowane dynamicznie - wiersze 46 - 73. Nie zostaną zarejestrowane, chyba że będą potrzebne - to znaczy, o ile nie są wymagane za pośrednictwem $_GETlub $_POST.
  5. Hak API „bicia serca” odpala - linia 75
  6. Status „zalogowanego” żądającego użytkownika jest sprawdzany i uruchamiany jest odpowiedni haczyk administracyjny lub „brak uprawnień”.

Moim zdaniem elementy nr 1 i nr 6 są podstawowymi przyczynami korzystania z interfejsu API AJAX. Masz WordPress Core, którego prawie na pewno potrzebujesz, i masz taki sam system bezpieczeństwa logowania jak w pozostałej części WordPress.

s_ha_dum
źródło
6

admin-ajax.phpjest częścią API AJAX WordPress i tak, obsługuje żądania zarówno z zaplecza, jak i z przodu. oto, co wymyślę dla twojego pytania, które jest:

2) Jak działa admin-ajax.php?

dla logiki, którą możesz odwiedzić tutaj.

Zakłada się, że wiesz już, jak kolejkować JavaScript itp.

Fragment 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);
        }
    });   

});

Kawałek 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) Dlaczego warto korzystać z admin-ajax.php zamiast kodować plik Json w osobnym pliku, takim jak themes / example / json.php, i kodować tam swoje dane?

może być to pomocne. admin-ajax.php vs Niestandardowy szablon strony dla żądań Ajax

sohan
źródło
Hej, czy możesz wyjaśnić te haczyki akcji „wp_ajax_example_ajax_request” i „wp_ajax_nopriv_example_ajax_request” Nie znajduję nigdzie wyjaśnienia. Co również rozwiązuje ajaxurl? Dzięki
David Okwii