it-swarm.com.de

Plugin: AJAX Fragen Sie die externe API ab, um eine Synchronisierung mit Tabellen durchzuführen

Ich plane, ein Plugin zu schreiben, das sich in eine externe API einbindet und einige Informationen mit einigen Datenbanktabellen synchronisiert.

Ich möchte dies nach bewährten Methoden tun, wenn es eine gibt. Ich möchte, dass der Benutzer in der Lage ist, auf eine Schaltfläche unter den Admin-Optionen für das Plugin zu klicken und dies manuell als Option über cron zu tun.

Ich nehme an, es könnte einige Minuten dauern, also überlegte ich, ob ich eine Art Knopf verwenden und eine Aktion anhängen sollte, die mit jQuery gestartet werden sollte, um über AJAX eine Art Timer zu starten, bis sie abgeschlossen ist.

Aus irgendeinem Grund habe ich Probleme zu überlegen, wie dies erreicht werden kann, und ich habe mir eine gewisse Richtung für die Verwendung von WP -Features anstelle eines Hack-Jobs erhofft. Ich hatte eine Weile Probleme mit der Plugin-Entwicklung, meine Füße wiederzufinden.

1
Jimbo

Skizze/Konzept

Verwenden Sie die WP-HTTP-API , um Anforderungen an ferne/externe APIs zu stellen. Ausführlichere Beispiele/Details finden Sie in einigen meiner Antworten hier .

Dann fügen Sie einfach eine Admin-Seite mit add_submenu_page() oder add_menu_page() oder den zugehörigen Funktionen hinzu .

Fügen Sie abschließend ein Skript über wp_register/enqueue_script() am admin_enqueue_scripts-hook hinzu. Dort lösen Sie einen Ajax (Archiv durchsuchen) -Aufruf aus und aktualisieren Ihre Tabellen.

Verwenden Sie Ajax in Plugins

Es ist ziemlich einfach. Hier ist ein kurzes Modell. Es zeigt alles , was benötigt wird, um jeden möglichen AJAX Aufruf auszuführen. Ich habe die Registrierung und die Warteschlange des Skripts aufgeteilt, damit Sie das Skript in eine Warteschlange stellen können, wann und wo immer Sie es benötigen.

Nonces

Nonces- und Referrer-Checks sind aus Sicherheitsgründen bereits implementiert. Es wird ein konstantes Benennungsschema verwendet, damit es weniger verwirrt wird (insbesondere bei Nonce-Prüfungen).

OOP-Konstrukt mit einem gemeinsamen Namen

Das PHP:

class WPSEexampleAJAX
{
    public $name = 'wpse';

    public function __construct()
    {
        add_action( 'wp_loaded', array( $this, 'scriptsRegister' ) );
        add_action( 'admin_enqueue_scripts', array( $this, 'scriptsEnqueue' ) );

        // Logged in users - everybody in Admin
        add_action( "wp_ajax_{$this->name}_action", array( $this, 'ajaxCb' ) );
        // Guests/not logged in
        add_action( "wp_ajax_nopriv_{$this->name}_action", array( $this, 'ajaxCb' ) );
        add_action( 'admin_enqueue_scripts', array( $this, 'scriptsLocalize' ) );
    }

    public function scriptsRegister( $page )
    {
        $file = 'WPSEexample.js';
        wp_register_script(
            $this->name,
            plugins_url( "assets/scripts/{$file}", __FILE__ ),
            array(
                'jquery',
                // 'add other possible dependencies in here',
            ),
            filemtime( plugin_dir_path( __FILE__ )."assets/scripts/{$file}" ),
            true
        );
    }

    public function scriptsEnqueue( $page )
    {
        wp_enqueue_script( $this->name );
    }

    public function scriptsLocalize( $page )
    {
        wp_localize_script( $this->name, "{$this->name}Object", array(
            'ajaxurl'          => admin_url( 'admin-ajax.php' ),
            '_ajax_nonce'      => wp_create_nonce( "{$this->name}_action" ),
            'action'           => "{$this->name}_action",
            'post_type'        => get_current_screen()->post_type,
            // 'foo'              => 'bar',
        ) );
    }

    public function ajaxCb()
    {
        $data = array_map( 'esc_attr', $_GET );

        check_ajax_referer( $data['action'] );

        // DO STUFF IN HERE

        wp_send_json_success( array(
            // 'foo' => 'bar',
        ) );
    }
}

Das JavaScript ist ein aktueller AJAX send/catch

In Ihrer registrierten JavaScript-Datei lösen Sie einfach den Ajax-Aufruf aus und rufen das Ergebnis ab. Heutzutage gibt es verschiedene Punkte, an denen Sie das Ergebnis abfangen oder abfangen können. Das Skript macht eigentlich gar nichts, sondern meldet sich einfach bei der Konsole an. Die wpseObject, die lokalisiert wurde, hat einen Alias ​​im Funktionsaufruf, sodass Sie stattdessen einfach plugin verwenden können. Ich mache das gerne so, damit ich das lokalisierte Objekt später leicht identifizieren kann (auch kürzer zum Schreiben). Es ist nur meine persönliche Namenskonvention.

( function( $, plugin ) {
    "use strict";

        $.ajax( {
            url  : plugin.ajaxurl,
            data : {
                action      : plugin.action,
                _ajax_nonce : plugin._ajax_nonce,
                foo         : plugin.foo,
            },
            beforeSend : function( d ) {
                console.log( 'AJAX Before send', d );
            }
        } )
            .done( function( response, textStatus, jqXHR ) {
                // console.log( 'AJAX done', data, textStatus, jqXHR, jqXHR.getAllResponseHeaders() );
            } )
            .fail( function( jqXHR, textStatus, errorThrown ) {
                console.log( 'AJAX failed', jqXHR.getAllResponseHeaders(), textStatus, errorThrown );
            } )
            .then( function( jqXHR, textStatus, errorThrown ) {
                console.log( 'AJAX after', jqXHR, textStatus, errorThrown );
            } );
} )( jQuery || {}, wpseObject || {} );

Weitere Informationen zu den verschiedenen Teilen des Aufrufs $.ajax()finden Sie in der offiziellen jQuery-Dokumentation .

Tipp: Stellen Sie sicher, dass Sie immer jQuery aus WordPress Core und keine CDN-Version verwenden. Andernfalls stoßen Sie wahrscheinlich auf Konflikte oder veraltete Versionen, falls ein Benutzer den Core aktualisiert, aber nicht Ihr Plugin.

1
kaiser