WordPress

jquery — Tworzenie zaplecza Ajax dla specjalistycznego szablonu strony? Czy należy używać pliku admin-ajax.php?

  • 8 kwietnia, 2014
  • 4 min read
jquery — Tworzenie zaplecza Ajax dla specjalistycznego szablonu strony?  Czy należy używać pliku admin-ajax.php?


Najlepszym rozwiązaniem jest użycie interfejsu API WP AJAX. Po pierwsze, otrzymujesz dostęp do pełnego zestawu interfejsów API WP, możesz wykorzystać standardowy jQuery $.ajax() i podobne wywołania API, a ty działasz zgodnie ze standardami, uzyskując dostęp do całej wiedzy rozpowszechnianej w Internecie za pomocą artykułów lub np. Odpowiedzi na tej stronie. Na krótką metę możesz myśleć, że jesteś szybszy, ale na dłuższą metę po prostu odcinasz się od wszelkich źródeł pomocy.

Przykład: debugowanie

Będziesz musiał wdrożyć niestandardowe trasy debugowania, podczas gdy WordPress AJAX ma wiele źródeł, które pomogą Ci obejść ten problem.

Najlepiej skorzystać z tzw $wpdb klasa.

class CustomDatabaseHandler extends wpdb
{
    // Overwrite what you need here
}

Więcej informacji w tej odpowiedzi.

Główną wadą „problemu”/wydajności podczas korzystania z WP AJAX jest to, że każde żądanie admin-ajax.php faktycznie przeładowuje cały rdzeń WordPress. Ten plik można zastąpić, jak pokazano @Rarst w tej odpowiedzi, niestandardowym plikiem, który zmniejsza wpływ i ładuje tylko to, czego potrzebujesz.

Ponieważ robię to na co dzień: nie ma problemu z opracowaniem aplikacji poza WordPressem, a następnie po prostu pobraniem jej za pomocą Composera (lub innego menedżera pakietów, którego używasz) i załadowaniem go z prostego pojedynczego pliku w folderze wtyczek która nie ma nic poza wywołaniem żądania naszego programu ładującego, kontrolera i komentarza nagłówka, który deklaruje go jako wtyczkę.

<?php
/** Plugin Name: Custom Application as Plugin */

# Composer autoloader
include_once __DIR__.'/vendor/autoload.php';

add_action( 'plugins_loaded', function()
{
    // Initialize your plugin here
} );

To wszystko, czego potrzebujesz.

Warto przeczytać!  Zoptymalizuj wydajność swojej witryny za pomocą Smush, Hummingbird i The Hub

Jeśli używasz aplikacji Angular.js, Ember lub Backbone WeApp, nie stanowi to problemu. WP AJAX poradzi sobie z tym bez problemu.

WordPress ponownie wykorzystuje swoje nonces, co jest dobrze znanym faktem. Tak naprawdę nie ujawnia to niczego ani nie otwiera całości bezpieczeństwa, ale można pójść o krok dalej i wygenerować nową wartość jednorazową [for every request as well]dzięki czemu Twoje połączenia będą… całkowicie bezpieczne.

Ponieważ nie ma sensu powtarzać innych odpowiedzi, po prostu przeczytaj ajax, spójrz na mój przykład GitHub Gist lub mój inny GitHub Gist, który pokazuje różne implementacje, aby pokazać, że wywołania zwrotne można dołączyć w dowolny możliwy sposób.

Ogólnie rzecz biorąc, Twoja wtyczka nie zrobi nic więcej niż następujące czynności:

// Public or private?
// 'wp_enqueue_scripts"
// or only on login?
// 'login_enqueue_scripts'
add_action( 'wp_enqueue_scripts', function()
{
    $name="handle";
    wp_register_script(
        $name,
        plugins_url( 'assets/ajax.js', __FILE__ ),
        [ 'jquery' ],
        filemtime( plugin_dir_path( __FILE__ ).'assets/ajax.js' ),
        true
    );
    wp_enqueue_script( $name );
    wp_localize_script(
        $name,
        "{$name}Obj", // This string is what gives you access to below array
        [
            'ajaxurl'     => admin_url( 'admin-ajax.php' ),
            '_ajax_nonce' => wp_create_nonce( "{$name}_action" ),
            'action'      => "{$name}_action",
            'data'        => [ /* additional data as array */ ],
        ]
    );
} );

Po prostu zarejestruj to i wywołanie zwrotne AJAX i gotowe:

// Public or private?
add_action( "wp_ajax_{$name}_action", 'ajaxCb' );
add_action( "wp_ajax_nopriv_{$name}_action", 'ajaxCb' );

public function ajaxCb( $data )
{
    check_ajax_referer( $data['action'] );

    # @TODO sanitize data here:
    // filter_var() filter_var_array() and filter_input()
    # @TODO Custom logic here

    // Error?
    if ( is_wp_error( $thing ) )
        wp_send_json_error( $data );

    // Success!
    wp_send_json_success( $data );
}

Uwaga: Obszerny przykład Istota dezynfekcji przy użyciu filter_var_array().

Plik AJAX.js będzie wyglądał mniej więcej tak:

/*global jQuery, $, handleObj */
( function( $, plugin ) {
    "use strict";
        var pass = $( '#password__field' ).val(),
            name = $( '#name__field' ).val();

        // @TODO other setup tasks for static vars in here

        $.ajax( {
            url  : plugin.ajaxurl,
            data : {
                action      : plugin.action,
                _ajax_nonce : plugin._ajax_nonce,
                userName    : name,
                passWord    : pass
            },
            beforeSend : function( d ) {
                // @TODO Add loading animation
            }
        } )
            .done( function( response, textStatus, jqXHR ) {
                // @TODO Clear loading animation
                if ( ! response.success ) {
                    // @TODO Custom error
                }
                else {
                    // @TODO success
                }
            } )
            .fail( function( jqXHR, textStatus, errorThrown ) {
                console.log( errorThrown );
            } );
} ( jQuery, handleObj || {} ) );

Nie ma nic więcej do zrobienia poza wypełnieniem luk/logiką aplikacji w tym, co pokazano powyżej w kodzie.

Warto przeczytać!  php — Wysyłaj wiele e-maili do poszczególnych subskrybentów, gdy post CPT zostanie usunięty (wyrzucony do kosza)


Źródło