Plugin: AJAX Query externe API zur Synchronisation mit Tabellen

Ich plane, ein Plugin zu schreiben, das in eine externe API einhakt und einige Informationen zu einigen databasetabellen synchronisiert.

Ich möchte dies in bester Praxis tun, wenn es einen 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 ein paar Minuten dauern, also dachte ich darüber nach, einen Knopf zu drücken und eine Aktion anzuhängen, die mit jQuery gestartet wird, um über AJAX abzufeuern und eine Art Timer bis zum Abschluss zu setzen.

Aus irgendeinem Grund habe ich Schwierigkeiten, darüber nachzudenken, wie ich das erreichen könnte, und ich habe mir ein paar Tipps für die Best-Practice-Methode mit WP-functionen und nicht für einen Hack-Job gewünscht. Hatte mein Auge aus der Plugin-Entwicklung für eine Weile versucht, meine Füße wieder zu finden.

Solutions Collecting From Web of "Plugin: AJAX Query externe API zur Synchronisation mit Tabellen"

Skizze / Konzept

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

Dann fügen Sie einfach eine add_submenu_page() mit add_submenu_page() oder add_menu_page() oder den zugehörigen functionen hinzu.

wp_register/enqueue_script() ein Skript über wp_register/enqueue_script() auf dem admin_enqueue_scripts -hook hinzu. Dort feuern Sie einen Ajax (Sucharchive) Aufruf und aktualisieren Sie Ihre Tabellen.

Verwenden Sie Ajax in Plugins

Es ist ziemlich einfach. Hier ist ein schnelles Modell. Es zeigt alles an , was benötigt wird, um jeden möglichen AJAX-Aufruf auszuführen. Ich habe die Registrierung und das Einreihen des Skripts aufgeteilt, damit Sie das Skript jederzeit und überall in die Warteschlange stellen können.

Nonces

Nonces und Referrer-Checks sind bereits aus Sicherheitsgründen implementiert. Es verwendet ein konstantes Namensschema, so dass es weniger verwirrend wird (besonders bei den 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 echtes AJAX senden / fangen

In der registrierten JavaScript-Datei feuern Sie einfach den Ajax-Aufruf und rufen das Ergebnis ab. Heutzutage haben Sie verschiedene Punkte, an denen Sie das Ergebnis abfangen oder abfangen können. Das Skript macht nicht wirklich etwas, sondern loggt sich einfach in die Konsole ein. Das wpseObject , das lokalisiert wurde, hat einen Alias ​​im functionsaufruf, so dass Sie stattdessen einfach das plugin verwenden können. Ich mag es so, so dass ich das lokalisierte Objekt später leichter 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 für den Aufruf von $.ajax() in der offiziellen jQuery-Dokumentation .

Hinweis: Stellen Sie sicher, dass Sie immer jQuery aus WordPress Core und keine CDN-Version verwenden. Sonst wirst du wahrscheinlich mit Konflikten oder veralteten Versionen an die Wand gehen, falls ein Benutzer den Core aktualisiert, aber nicht dein Plugin.