Erstellen Sie ein lizenzgesteuertes Update-System: Die License Manager-API
() translation by (you can also view the original English article)
Dies ist das zweite Tutorial in einer dreiteiligen Tutorialserie zum Erstellen eines lizenzgesteuerten WordPress-Plugins und eines Themes-Update-Systems.
Im ersten Teil der Serie haben wir ein WordPress-Plugin zum Speichern und Verwalten von Softwarelizenzen erstellt. In Teil drei werden wir ein WordPress-Theme erstellen, das den Lizenzmanager-Server verwendet, um nach Updates zu suchen und sie herunterzuladen.
In diesem Lernprogramm erstellen wir die Schnittstelle zwischen den beiden: Eine API mit zwei Aktionen, die von einer externen Site aus aufgerufen werden können, um Informationen zu einem Produkt und seiner Lizenz zu erhalten und das Produkt herunterzuladen.
Während Sie an dem Plugin arbeiten, lernen Sie folgende Themen kennen:
- Erstellen einer API auf einem WordPress-Plugin.
- Einstellungsseite erstellen.
- Hochladen von Dateien zu Amazon Simple Storage Service (S3)
- Verwenden des AWS SDK zum Erstellen von signierten URLs, mit denen private Dateien von S3 heruntergeladen werden können.
Wir werden das Plugin weiterhin auf den Code aufbauen, den wir in Teil 1 des Tutorials erstellt haben. Daher sollten Sie in der Lage sein, ein funktionsfähiges Plugin zu erstellen, indem Sie die Schritte ausführen. Wenn Sie das Lernprogramm mit dem Readymade-Code verfolgen möchten, checken Sie den Quellcode im Tuts + Github-Repository aus, das rechts verlinkt ist.
Lass uns anfangen.
Lizenzmanager-API erstellen
Eine API kann viele verschiedene Bedeutungen haben. In diesem Lernprogramm bedeutet dies eine Reihe von Aktionen (häufig als Methoden bezeichnet), die über eine HTTP-Verbindung aufgerufen werden können, um auf einen genau definierten, begrenzten Teil der Funktionalität der Anwendung zuzugreifen.
In Teil drei der Serie werden wir diese API in einem erstklassigen WordPress-Plugin oder Design verwenden, um die Gültigkeit der Lizenz zu prüfen und Updates herunterzuladen. Die API selbst setzt jedoch keine Einschränkungen. Die Anwendung, die die API verwendet, kann genauso gut ein Spiel sein, das vor dem Spielen mit einem Lizenzschlüssel aktiviert werden muss.
Auf unsere API können Sie über die URL https://<yoursite>/api/license-manager/v1/
zugreifen. Dabei ist Ihre Site die URL Ihrer WordPress-Site, auf der das WP License Manager-Plugin ausgeführt wird. Die API hat zwei Funktionen:
-
info
: Gibt Informationen zum angeforderten Produkt zurück, wenn der angegebene Lizenzschlüssel gültig ist. -
get
: Gibt die herunterladbare Datei zurück, wenn der angegebene Lizenzschlüssel gültig ist.
Lass es uns bauen!
Schritt 1: Erstellen Sie eine Klasse für die API-Funktionalität
Bisher haben wir die vorhandenen Klassen aus der WordPress-Plugin-Boilerplate verwendet, aber jetzt, um die Dinge sauber zu halten, fügen wir eine neue Klasse zum Speichern der API-spezifischen Funktionalität hinzu.
Eine API ist ein öffentlicher Teil des Plugins, daher muss die neue Klasse in das public
-Verzeichnis in der Plugin-Boilerplate wechseln. Rufen Sie die API-Klasse Wp_License_Manager_API
auf und platzieren Sie sie in einer Datei namens class-wp-license-manager-api.php
.
Machen Sie jetzt eine leere Klasse:
1 |
/**
|
2 |
* The API handler for handling API requests from themes and plugins using
|
3 |
* the license manager.
|
4 |
*
|
5 |
* @package Wp_License_Manager
|
6 |
* @subpackage Wp_License_Manager/public
|
7 |
* @author Jarkko Laine <jarkko@jarkkolaine.com>
|
8 |
*/
|
9 |
class Wp_License_Manager_API { |
10 |
|
11 |
}
|
Verknüpfen Sie die neu erstellte Klasse mit Ihrer Wp_License_Manager_Public
-Klasse, um sie bei Bedarf verfügbar zu machen. Fügen Sie zunächst ein Feld für die API-Klasse hinzu:
1 |
/**
|
2 |
* @var License_Manager_API The API handler
|
3 |
*/
|
4 |
private $api; |
Dann initialisieren Sie es im Konstruktor (Zeile 11 ist der neue, alles andere ist bereits aus Teil 1 vorhanden):
1 |
/** |
2 |
* Initialize the class and set its properties. |
3 |
* |
4 |
* @var string $plugin_name The name of the plugin. |
5 |
* @var string $version The version of this plugin. |
6 |
*/ |
7 |
public function __construct( $plugin_name, $version ) { |
8 |
$this->plugin_name = $plugin_name; |
9 |
$this->version = $version; |
10 |
|
11 |
$this->api = new Wp_License_Manager_API(); |
12 |
} |
Jetzt sind wir alle bereit, die API-Funktionalität zu erstellen.
Schritt 2: Definieren Sie Abfragevariablen für die API
Wie bereits erwähnt, erstellen wir zunächst ein spezielles URL-Format für den Zugriff auf die API. Auf diese Weise können wir die API-Aufrufe für andere Anforderungen an die Site trennen, ohne vom Rest der Inhalte der WordPress-Site verwirrt zu werden.
Standardmäßig (und unter der Haube) sind WordPress-URLs eine Kombination aus index.php
und einer Reihe von Abfrageparametern. Beispiel: http://<yoursite>/?p=123
(index.php
wird in der URL nicht angegeben.) aber da geht die Anfrage hin. Die meisten Sites verwenden - und wir werden auch - schönere Permalink-Einstellungen, um die URLs lesbarer zu machen. Dies ist jedoch nur eine Dekorationsebene über dieser Kernfunktionalität.
Um unsere API zu erstellen, müssen Sie zunächst eine benutzerdefinierte Abfragevariable __wp_license_api
anstelle von p
hinzufügen. Sobald dies funktioniert, fügen wir benutzerdefinierte Permalink-Einstellungen hinzu, um die API lesbarer zu machen.
Fügen Sie am Ende der Funktion define_public_hooks
in der Klasse Wp_License_Manager
die folgenden Zeilen hinzu, um einen Filter mit dem Hook query_vars
zu verknüpfen:
1 |
// The external API setup
|
2 |
$this->loader->add_filter( 'query_vars', $plugin_public, 'add_api_query_vars' ); |
Fügen Sie dann die Funktion in der Klasse Wp_License_Manager_Public
hinzu:
1 |
/**
|
2 |
* Defines the query variables used by the API.
|
3 |
*
|
4 |
* @param $vars array Existing query variables from WordPress.
|
5 |
* @return array The $vars array appended with our new variables
|
6 |
*/
|
7 |
public function add_api_query_vars( $vars ) { |
8 |
// The parameter used for checking the action used
|
9 |
$vars []= '__wp_license_api'; |
10 |
|
11 |
// Additional parameters defined by the API requests
|
12 |
$api_vars = $this->api->get_api_vars(); |
13 |
|
14 |
return array_merge( $vars, $api_vars ); |
15 |
}
|
Diese Funktion fügt unsere Abfragevariablen zur Whitelist von WordPress hinzu, indem Sie sie dem von dem Filter übergebenen $vars
-Array hinzufügen und das angehängte Array zurückgeben:
Zeile 9: Fügen Sie die Variable hinzu, um die API-Aktion anzugeben (und erkennen, dass die Anforderung tatsächlich für die API bestimmt ist), __wp_license_api
Zeile 12: Geben Sie der API-Klasse die Möglichkeit, zusätzliche Parameter hinzuzufügen, die von ihren Funktionen verwendet werden.
Zeile 14: Gibt das aktualisierte $vars
-Array zurück.
Damit der Code funktioniert, müssen wir noch die Funktion get_api_vars
erstellen:
1 |
/**
|
2 |
* Returns a list of variables used by the API
|
3 |
*
|
4 |
* @return array An array of query variable names.
|
5 |
*/
|
6 |
public function get_api_vars() { |
7 |
return array( 'l', 'e', 'p' ); |
8 |
}
|
Da die API noch immer sehr einfach ist, habe ich mich dazu entschlossen, diese Funktion einfach zu gestalten und alle Parameter in ein Array aufzunehmen und zurückzugeben.
Schritt 3: Fangen Sie die API-Anforderungen ab
Wir haben jetzt unsere Abfragevariablen auf die weiße Liste gesetzt, aber sie tun noch nichts. Damit die Variablen etwas bewirken können, müssen Sie eine Funktionalität zum Erfassen der API-Anforderungen erstellen.
Dies kann mit der WordPress-Aktion parse_request
durchgeführt werden.
Verknüpfen Sie in Wp_License_Managers
define_public_hooks
eine Funktion mit der Aktion:
1 |
$this->loader->add_action( 'parse_request', $plugin_public, 'sniff_api_requests' ); |
Nun werden alle zukünftigen Anforderungen an diese WordPress-Installation diese Funktion durchlaufen, bevor sie an die eigenen Anforderungsbehandlungsfunktionen von WordPress weitergeleitet werden. Das bedeutet, dass wir die Handlerfunktion leichtgewichtig halten müssen: Überprüfen Sie, ob __wp_license_api
festgelegt wurde, und wenn nicht, kehren Sie schnell zurück und lassen Sie WordPress fortfahren. Wenn ja, ist es in Ordnung, etwas komplexeres Handling durchzuführen - dies ist unsere Bitte und wir werden es erledigen.
Die Funktion sniff_api_requests
geht in Wp_License_Manager_Public
:
1 |
/**
|
2 |
* A sniffer function that looks for API calls and passes them to our API handler.
|
3 |
*/
|
4 |
public function sniff_api_requests() { |
5 |
global $wp; |
6 |
if ( isset( $wp->query_vars['__wp_license_api'] ) ) { |
7 |
$action = $wp->query_vars['__wp_license_api']; |
8 |
$this->api->handle_request( $action, $wp->query_vars ); |
9 |
|
10 |
exit; |
11 |
}
|
12 |
}
|
Zeile 6: Prüfen Sie, ob die API-Aktionsabfragevariable vorhanden ist. Wenn ja, ist dies ein Aufruf an diese API.
Zeilen 7-8: Übergeben Sie die Anforderung an die zu behandelnde Funktion handle_request
der API-Klasse. Als nächstes erstellen wir diese Funktion.
Zeile 10: Stoppen Sie die Ausführung der WordPress-Anfrage, sobald wir den API-Aufruf bearbeitet haben. Dies ist wichtig, da sonst die Ausführung mit WordPress fortgesetzt wird und nach der API-Ausgabe eine 404-Fehlerseite angezeigt wird.
Als nächstes fügen wir die Funktion handle_request
hinzu.
Im Moment ist dies eine reine Implementierung, mit der wir prüfen können, ob unser Framework funktioniert. Ich habe Platzhalter für die zwei Aktionen eingefügt, die wir in diesem Lernprogramm erstellen werden, und eine Standardantwort, die gesendet wird, wenn ein Benutzer eine API-Aktion verwendet, die wir nicht unterstützen.
1 |
/**
|
2 |
* The handler function that receives the API calls and passes them on to the
|
3 |
* proper handlers.
|
4 |
*
|
5 |
* @param $action string The name of the action
|
6 |
* @param $params array Request parameters
|
7 |
*/
|
8 |
public function handle_request( $action, $params ) { |
9 |
switch ( $action ) { |
10 |
case 'info': |
11 |
break; |
12 |
|
13 |
case 'get': |
14 |
break; |
15 |
|
16 |
default: |
17 |
$response = $this->error_response( 'No such API action' ); |
18 |
break; |
19 |
}
|
20 |
|
21 |
$this->send_response( $response ); |
22 |
}
|
Zeile 17: $response
ist ein Array mit den Informationen, die an die Anwendung übergeben werden sollen, die die API aufruft.
Zeile 21: Drucken Sie die Antwort als JSON-codierte Zeichenfolge aus.
Damit die Funktion funktioniert, müssen wir noch die von ihr verwendeten Hilfsfunktionen hinzufügen: send_response
und error_response
.
Zuerst send_response
:
1 |
/**
|
2 |
* Prints out the JSON response for an API call.
|
3 |
*
|
4 |
* @param $response array The response as associative array.
|
5 |
*/
|
6 |
private function send_response( $response ) { |
7 |
echo json_encode( $response ); |
8 |
}
|
Dann error_response
. Diese Funktion erstellt ein Array mit der angegebenen Fehlermeldung. Durch die Verwendung einer Funktion zum Generieren des Arrays können wir sicherstellen, dass alle Fehlermeldungen auf dieselbe Weise formatiert werden, und die Formatierung bei Bedarf später im Lebenszyklus des Plugins leicht ändern.
Fürs Erste habe ich mich für eine Basisversion entschieden, die nur eine Fehlermeldung innerhalb des Arrays enthält:
1 |
/**
|
2 |
* Generates and returns a simple error response. Used to make sure every error
|
3 |
* message uses same formatting.
|
4 |
*
|
5 |
* @param $msg string The message to be included in the error response.
|
6 |
* @return array The error response as an array that can be passed to send_response.
|
7 |
*/
|
8 |
private function error_response( $msg ) { |
9 |
return array( 'error' => $msg ); |
10 |
}
|
Jetzt haben Sie die Struktur erstellt, in der wir die API-Aktionen erstellen können. Rufen Sie zum Testen eine nicht vorhandene API-Aktion auf, beispielsweise http://<yoursite>/?__wp_license_api=dummy-action
in einem Browserfenster.
Sie sollten so etwas sehen:



Selbst wenn die API immer noch nur eine Fehlernachricht zurückgibt, zeigt der Test, dass die Anforderung an die korrekte Handlerfunktion weitergeleitet wird und nicht mit dem Rest des WordPress-Ablaufs verwechselt wird. So wie wir es wollten.
Bevor wir nun mit dem Hinzufügen von API-Funktionen beginnen, sollten wir uns die API-URL ein wenig leichter merken.
Schritt 4: Erstellen Sie ein benutzerdefiniertes URL-Format für die API
Während http://<yoursite>/?__wp_license_api=<action>
funktioniert, ist es nicht sehr hübsch, und es macht meiner Meinung nach auch ein wenig zu viel von den Internen der API-Implementierung preis. Erstellen wir also ein schöneres URL-Format, das stattdessen verwendet werden soll.
Zur Erinnerung an den Anfang dieses Abschnitts ist hier die URL, die wir verwenden werden:http://<yoursite>/api/license-manager/v1/
Ich habe der API-URL v1
hinzugefügt, nur für den Fall, dass wir irgendwann mehrere verschiedene Versionen der API unterstützen werden. Da die Versionsinformationen von Anfang an vorhanden sind, ist das Hinzufügen neuer Versionen einfacher.
Um "hübsche" URLs wie diese zu erstellen, setzen Sie die Option Permalinks in den WordPress-Einstellungen auf einen anderen Wert als den Standardwert (alle anderen Optionen außer "Default" sind in Ordnung).
Fügen Sie dann einen Filter hinzu, um eine neue Umschreibregel zu erstellen. Fügen Sie die Filterregistrierung zu define_public_hooks
von Wp_License_Manager
hinzu:
1 |
$this->loader->add_action( 'init', $plugin_public, 'add_api_endpoint_rules' ); |
Dann erstellen Sie die Funktion (in Wp_License_Manager_Public
):
1 |
/**
|
2 |
* The permalink structure definition for API calls.
|
3 |
*/
|
4 |
public function add_api_endpoint_rules() { |
5 |
add_rewrite_rule( 'api/license-manager/v1/(info|get)/?', |
6 |
'index.php?__wp_license_api=$matches[1]', 'top' ); |
7 |
|
8 |
// If this was the first time, flush rules
|
9 |
if ( get_option( 'wp-license-manager-rewrite-rules-version' ) != '1.1' ) { |
10 |
flush_rewrite_rules(); |
11 |
update_option( 'wp-license-manager-rewrite-rules-version', '1.1' ); |
12 |
}
|
13 |
}
|
Zeile 5: Definieren Sie mithilfe eines regulären Ausdrucks eine neue URL-Umschreibungsregel, um die Anforderungen entsprechend dem von uns vorgestellten Gedanken an die im vorherigen Schritt verwendete URL zu senden. (info|get
) definiert die API-Methoden, die die API akzeptieren soll.
Zeilen 9-12: Speichern Sie die Umschreiberegeln, um sie zu aktivieren. flush_rewrite_rules
ist ein aufwändiger Aufruf von Ressourcen, daher habe ich eine Überprüfung hinzugefügt, um sicherzustellen, dass die Spülung nur durchgeführt wird, wenn die Regeln geändert wurden.
Wenn dieser Schritt abgeschlossen ist, werden alle an http://<yoursite>/api/license-manager/v1/<action>
gesendeten Anforderungen in eine Anfrage an http://<yoursite>?__wp_license_api=<action>
umgewandelt . Testen Sie dies mit derselben Dummy-Aktion aus dem vorherigen Schritt - Sie sollten jetzt das gleiche Ergebnis mit beiden URLs erhalten.
Das API-Framework ist jetzt vorhanden, und wir können damit beginnen, Funktionalität hinzuzufügen.
Schritt 5: Erstellen Sie die Funktionalität zum Überprüfen von Lizenzen
Beide API-Aktionen, die wir in diesem Lernprogramm erstellen, beginnen mit der Überprüfung der Benutzerlizenz.
Zuerst habe ich den Lizenzbestätigungscode für beide separat geschrieben, aber als ich die beiden Handler sah, fiel mir schnell auf, dass sie genau gleich waren. Für mich ist dies ein gutes Zeichen, dass es Zeit ist, Refactoring durchzuführen.
Um Zeit zu sparen, überspringen wir den Schritt, in dem wir denselben Code zweimal schreiben, und fahren stattdessen direkt mit der endgültigen Version fort und fügen den allgemeinen Code in eine eigene Funktion ein.
Erstellen Sie in Wp_License_Manager_API
eine Funktion mit dem Namen verify_license_and_execute
. Diese Funktion wird als zusätzlicher Schritt zwischen der zuvor erstellten Funktion und der tatsächlichen Bearbeitung der Anforderungen verwendet.
1 |
/**
|
2 |
* Checks the parameters and verifies the license, then forwards the request to the
|
3 |
* actual API request handlers.
|
4 |
*
|
5 |
* @param $action_function callable The function (or array with class and function) to call
|
6 |
* @param $params array The WordPress request parameters.
|
7 |
* @return array API response.
|
8 |
*/
|
9 |
private function verify_license_and_execute( $action_function, $params ) { |
10 |
if ( ! isset( $params['p'] ) || ! isset( $params['e'] ) || ! isset( $params['l'] ) ) { |
11 |
return $this->error_response( 'Invalid request' ); |
12 |
}
|
13 |
|
14 |
$product_id = $params['p']; |
15 |
$email = $params['e']; |
16 |
$license_key = $params['l']; |
17 |
|
18 |
// Find product
|
19 |
$posts = get_posts( |
20 |
array ( |
21 |
'name' => $product_id, |
22 |
'post_type' => 'wplm_product', |
23 |
'post_status' => 'publish', |
24 |
'numberposts' => 1 |
25 |
)
|
26 |
);
|
27 |
|
28 |
if ( ! isset( $posts[0] ) ) { |
29 |
return $this->error_response( 'Product not found.' ); |
30 |
}
|
31 |
|
32 |
// Verify license
|
33 |
if ( ! $this->verify_license( $posts[0]->ID, $email, $license_key ) ) { |
34 |
return $this->error_response( 'Invalid license or license expired.' ); |
35 |
}
|
36 |
|
37 |
// Call the handler function
|
38 |
return call_user_func_array( $action_function, array( $posts[0], $product_id, $email, $license_key ) ); |
39 |
}
|
Zeilen 10-12: Stellen Sie sicher, dass alle lizenzrelevanten Parameter vorhanden sind. p
ist der Slug des Produkts, e
ist die E-Mail-Adresse des Benutzers und l
ist der Lizenzschlüssel.
Zeilen 14-16: Parameter sammeln und desinfizieren.
Zeilen 19-26: Suchen Sie den Beitrag, der der angegebenen Produkt-ID entspricht. Wie bereits erwähnt, handelt es sich bei der Produkt-ID eigentlich um den Post Slug des Produkts, damit der Benutzer den richtigen Wert für das Produkt leichter erkennen kann.
Zeilen 28-30: Wenn das Produkt nicht gefunden wird, einen Fehler zurückgeben.
Zeilen 33-35: Führen Sie die eigentliche Lizenzschlüsselüberprüfung durch. Als nächstes erstellen wir diese Funktion.
Zeile 38: Rufen Sie die für die Behandlung der API-Aktion verantwortliche Funktion auf. Als Entwicklungsidee für die Zukunft wäre dies ein großartiger Ort für einen Filter, den andere Plugins verwenden könnten, um die Handlerfunktion bei Bedarf zu ersetzen.
Als Nächstes fügen Sie die Funktion zum Überprüfen der Lizenz hinzu:
1 |
/**
|
2 |
* Checks whether a license with the given parameters exists and is still valid.
|
3 |
*
|
4 |
* @param $product_id int The numeric ID of the product.
|
5 |
* @param $email string The email address attached to the license.
|
6 |
* @param $license_key string The license key.
|
7 |
* @return bool true if license is valid. Otherwise false.
|
8 |
*/
|
9 |
private function verify_license( $product_id, $email, $license_key ) { |
10 |
$license = $this->find_license( $product_id, $email, $license_key ); |
11 |
if ( ! $license ) { |
12 |
return false; |
13 |
}
|
14 |
|
15 |
$valid_until = strtotime( $license['valid_until'] ); |
16 |
if ( $license['valid_until'] != '0000-00-00 00:00:00' && time() > $valid_until ) { |
17 |
return false; |
18 |
}
|
19 |
|
20 |
return true; |
21 |
}
|
Zeilen 10-13: Suchen Sie die Lizenz anhand der gesendeten Parameter aus der Datenbank (wir fügen diese Funktion als Nächstes hinzu). Wenn die Lizenz nicht gefunden wird, kann sie nicht gültig sein, sodass wir false zurückgeben können.
Zeilen 15-18: Wenn die Lizenz vorhanden ist, prüfen Sie, ob sie abgelaufen ist. Im ersten Teil des Tutorials haben wir definiert, dass 0000-00-00 00:00:00
für eine Lizenz verwendet wird, die niemals abläuft.
Zeile 20: Alle Prüfungen bestanden, die Lizenz ist gültig.
Um den Lizenzvalidierungscode abzuschließen, benötigen wir schließlich die Funktion zum Abrufen einer Lizenz aus der Datenbank.
Fügen Sie die Funktion find_license hinzu:
1 |
/**
|
2 |
* Looks up a license that matches the given parameters.
|
3 |
*
|
4 |
* @param $product_id int The numeric ID of the product.
|
5 |
* @param $email string The email address attached to the license.
|
6 |
* @param $license_key string The license key
|
7 |
* @return mixed The license data if found. Otherwise false.
|
8 |
*/
|
9 |
private function find_license( $product_id, $email, $license_key ) { |
10 |
global $wpdb; |
11 |
$table_name = $wpdb->prefix . 'product_licenses'; |
12 |
|
13 |
$licenses = $wpdb->get_results( |
14 |
$wpdb->prepare( "SELECT * FROM $table_name WHERE product_id = %d AND email = '%s' AND license_key = '%s'", |
15 |
$product_id, $email, $license_key ), ARRAY_A ); |
16 |
|
17 |
if ( count( $licenses ) > 0 ) { |
18 |
return $licenses[0]; |
19 |
}
|
20 |
|
21 |
return false; |
22 |
}
|
In dieser Funktion führen wir eine SQL-Abfrage aus, um nach einer Lizenz mit den genauen Parametern, Produkt-ID, E-Mail und Lizenzschlüssel zu suchen. Auf diese Weise müssen wir die Antwort nicht zusätzlich analysieren, als zu sehen, ob ein Ergebnis vorliegt oder nicht.
Wenn eine Lizenz gefunden wird, gibt die Funktion diese zurück. Andernfalls wird false
zurückgegeben.
Schritt 6: Fügen Sie die Produktinformations-API-Aktion hinzu
Als Nächstes fügen wir die erste der beiden Aktionen hinzu, info
. Geben Sie in der Funktion handle_request
, die wir vor einiger Zeit erstellt haben, den Fallzweig für die Aktion ein:
1 |
case 'info': |
2 |
$response = $this->verify_license_and_execute( array( $this, 'product_info' ), $params ); |
3 |
break; |
Die Zeile, die wir hinzugefügt haben, ruft unsere Funktion verify_license_and_execute
mit zwei Parametern auf:
- Der erste Parameter sollte Ihnen aus den WordPress-Aktionen und -Filtern, die wir während der gesamten Lernreihe erstellt haben, bekannt sein. Sie übergibt den Namen der Funktion, mit der die Aktion ausgeführt werden soll, sobald die Lizenz überprüft wurde. Da sich die Funktion innerhalb einer Klasse befindet, müssen wir ein Array übergeben, nicht nur den Namen der Funktion.
- Der zweite Parameter ist die Liste aller an WordPress gesendeten Anforderungsparameter.
Wir haben uns schon angesehen, was in verify_license_and_execute
passiert, also fügen wir die Funktion product_info
hinzu. Diese Funktion sammelt Informationen zum Produkt und gibt sie als Array zurück.
Wie Sie sich wahrscheinlich aus Teil 1 des Lernprogramms erinnern, werden Produkte im Lizenzmanager-Plugin als benutzerdefinierter Beitragstyp mit einer Meta-Box zum Eingeben zusätzlicher Produktinformationen gespeichert. In dieser Funktion greifen wir auf diese Daten zu und füllen das $response
-Array mit Informationen zum angeforderten Produkt:
1 |
/** |
2 |
* The handler for the "info" request. Checks the user's license information and |
3 |
* returns information about the product (latest version, name, update url). |
4 |
* |
5 |
* @param $product WP_Post The product object |
6 |
* @param $product_id string The product id (slug) |
7 |
* @param $email string The email address associated with the license |
8 |
* @param $license_key string The license key associated with the license |
9 |
* |
10 |
* @return array The API response as an array. |
11 |
*/ |
12 |
private function product_info( $product, $product_id, $email, $license_key ) { |
13 |
// Collect all the metadata we have and return it to the caller |
14 |
$meta = get_post_meta( $product->ID, 'wp_license_manager_product_meta', true ); |
15 |
|
16 |
$version = isset( $meta['version'] ) ? $meta['version'] : ''; |
17 |
$tested = isset( $meta['tested'] ) ? $meta['tested'] : ''; |
18 |
$last_updated = isset( $meta['updated'] ) ? $meta['updated'] : ''; |
19 |
$author = isset( $meta['author'] ) ? $meta['author'] : ''; |
20 |
$banner_low = isset( $meta['banner_low'] ) ? $meta['banner_low'] : ''; |
21 |
$banner_high = isset( $meta['banner_high'] ) ? $meta['banner_high'] : ''; |
22 |
|
23 |
return array( |
24 |
'name' => $product->post_title, |
25 |
'description' => $product->post_content, |
26 |
'version' => $version, |
27 |
'tested' => $tested, |
28 |
'author' => $author, |
29 |
'last_updated' => $last_updated, |
30 |
'banner_low' => $banner_low, |
31 |
'banner_high' => $banner_high, |
32 |
"package_url" => home_url( '/api/license-manager/v1/get?p=' . $product_id . '&e=' . $email . '&l=' . urlencode( $license_key ) ), |
33 |
"description_url" => get_permalink( $product->ID ) . '#v=' . $version |
34 |
); |
35 |
} |
Zeile 14: Produktinformationen aus den Post-Metadaten abrufen.
Zeilen 16-21: Sammeln Sie die Daten aus den Metadatenfeldern.
Zeilen 23-34: Erstellen Sie die Antwort. Meistens geht es nur darum, die Daten aus den Zeilen 16-21 in das Array einzufügen. Eine Zeile, Zeile 32, verdient jedoch mehr Aufmerksamkeit.
Dies ist für das WordPress-Aktualisierungssystem, das wir im nächsten Tutorial der Serie verwenden werden. Um diesen Schritt zu vereinfachen, gibt die info-Aktion eine URL zurück, die auf die andere get
-Aktion der API zeigt, mit allen erforderlichen Parametern.
Schritt 7: Testen Sie die API-Aktion
Sie haben jetzt die erste unserer beiden API-Funktionen erstellt. Wenn Sie möchten, können Sie die Funktionalität testen, indem Sie die API-Methode in einem Webbrowser aufrufen. Stellen Sie nur sicher, dass die Daten ordnungsgemäß eingerichtet sind, bevor Sie den Anruf tätigen: Es muss ein Produkt und eine Lizenz im System vorhanden sein, damit die API-Aktion funktioniert.
Ein weiterer Haken ist, dass Sie die E-Mail- und Lizenzschlüssel-Parameter vor dem Platzieren in die URL kodieren müssen, da sie Sonderzeichen enthalten.
Die Ausgabe sieht in etwa so aus, je nachdem, was Sie als Produktdaten gespeichert haben:



Speichern von Dateien in Amazon S3
Nach Abschluss der ersten Hälfte der API ist es an der Zeit, die zweite API-Funktion get
zu untersuchen. Diese API-Funktion überprüft den Lizenzschlüssel auf dieselbe Weise wie bei info
und gibt dann die herunterladbare Datei zurück.
Damit die API-Aktion sinnvoll ist, ist es wichtig, dass auf den Download nicht ohne einen gültigen Lizenzschlüssel zugegriffen werden kann, indem einfach die API umgangen wird und die Datei direkt aufgerufen wird. Amazons Simple Storage Service (S3) bietet diese Funktionalität einfach und kostengünstig (für die meisten Benutzer fast kostenlos) und macht den Download zudem zuverlässig.
In den nächsten Schritten wird zunächst beschrieben, wie Sie die Dateien mithilfe des Online-Dashboards von AWS (Amazon Web Services) in Amazon S3 hochladen. Sobald die Datei hochgeladen wurde, fügen wir die API-Funktionalität zum Herunterladen hinzu.
Wenn Sie bereits Amazon S3 verwenden und sich damit auskennen, können Sie direkt mit dem nächsten Abschnitt fortfahren und die get
-Aktion implementieren. Wenn Sie S3 noch nicht kennen, lesen Sie weiter.
Schritt 1: Erstellen Sie ein Konto
Das Erstellen eines AWS-Kontos ist gut dokumentiert, hat jedoch viele Schritte.
Gehen Sie zuerst zu aws.amazon.com und klicken Sie oben rechts auf "Anmelden".
Auf dem folgenden Bildschirm haben Sie die Möglichkeit, ein neues Amazon-Konto zu erstellen oder ein vorhandenes Konto zu verwenden, das Sie für andere Amazon-Dienste verwendet haben (beispielsweise den Online-Shop selbst):



Sie haben die Wahl: Wenn Sie sich für die Erstellung eines neuen Kontos entscheiden, wird dies als Nächstes geschehen. Wenn Sie Ihr vorhandenes Konto verwenden, springt der Ablauf direkt in den fünf Schritte des Einrichtens Ihres AWS-Kontos. Während der Registrierung werden Sie aufgefordert, Ihre Kreditkartendaten einzugeben. Bei den meisten Verwendungszwecken müssen Sie sich nicht um den Preis kümmern.
Nachdem Sie Ihre Kreditkarteninformationen eingegeben haben, bevor Ihr Konto akzeptiert wird, müssen Sie Ihre Telefonnummer bestätigen. Amazon ruft automatisch Ihre Telefonnummer an und fordert Sie auf, den auf Ihrem Bildschirm angezeigten vierstelligen Code einzugeben. Als ich es beim Versuch dieses Tutorials erneut versuchte, hatte ich Schwierigkeiten, den Code mit der iPhone-Tastatur einzugeben. Es war jedoch perfekt, die Zahlen einzeln laut auszusprechen.



Der letzte Schritt ist die Auswahl eines Support-Plans. Ich schlage vor, Sie wählen die kostenlose Option für jetzt. Es gibt wirklich keine großen Unterstützungsanforderungen für S3, und Sie können die Option noch einmal überdenken, wenn Sie sich für die erweiterten Funktionen entscheiden.
Nachdem Sie Ihr Konto erstellt und aktiviert haben, fügen Sie eine Datei hinzu.
Schritt 2: Bucket erstellen
Starten Sie die AWS Management Console und wählen Sie im Optionsbildschirm S3 aus:



Der AWS-Administrator bietet viele Funktionen, aber Sie können den Rest vorerst ignorieren (dies sind fortgeschrittene Dinge, die die meisten WordPress-Entwickler nie brauchen werden - ich verwende im Moment nur S3 und EC2).
Nun, da Sie sich in der S3-Administrationskonsole befinden, erstellen Sie zunächst einen Bucket. Ein Bucket ist ein Container der obersten Ebene für Ihre S3-Dateien, der Ordner und Dateien enthalten kann. So beschreibt die AWS-Dokumentation das Konzept:
Jedes in Amazon S3 gespeicherte Objekt befindet sich in einem Bucket. Sie können Buckets verwenden, um verwandte Objekte auf dieselbe Weise zu gruppieren, wie Sie ein Verzeichnis verwenden, um Dateien in einem Dateisystem zu gruppieren. Buckets verfügen über Eigenschaften wie Zugriffsberechtigungen und den Status der Versionierung. Sie können den Bereich angeben, in dem sie sich befinden sollen.



Geben Sie Ihrem Bucket einen Namen, der aus Kleinbuchstaben (a-z), Zahlen, Bindestrichen und Punkten besteht (nähere Angaben finden Sie in der Dokumentation) und klicken Sie auf "Erstellen".
Wenn Sie möchten, können Sie auch eine Region auswählen, in der Ihre Dateien gespeichert werden sollen. Es ist jedoch vollkommen in Ordnung, die Einstellung auf die Standardeinstellung zu belassen.
Nachdem Sie den Bucket erstellt haben, wird eine Dateibrowseransicht mit dem erstellten Bucket angezeigt:



In diesem Bildschirm können Sie beliebig viele neue Buckets erstellen. Fürs Erste reicht es. Klicken Sie auf den Namen des Buckets, um Dateien hinzuzufügen.
Schritt 3: Datei hochladen
Der soeben erstellte Bucket enthält die Downloads für Ihre Lizenzmanager-Installation. Wir werden die herunterladbaren Designs und Plugins erst im dritten und letzten Teil des Tutorials erstellen. Erstellen Sie zum Testen einfach eine ZIP-Datei mit etwas (zum Beispiel einer Textdatei).
Klicken Sie auf die Schaltfläche Hochladen in der oberen linken Ecke des S3-Verwaltungsbildschirms. Ein Upload-Bildschirm wird angezeigt:



Wählen Sie Add Files, um die hochzuladenden Dateien auszuwählen. Klicken Sie dann auf Start Upload.
Wir könnten Set Details verwenden, um die Dateiberechtigungen festzulegen. Da wir den Download jedoch nicht öffentlich verfügbar machen möchten, sind die Standardoptionen genau das, was wir wollen.
Nachdem die Datei hochgeladen wurde, wird sie in Ihrem Bucket angezeigt:



Schließen Sie das Transferfenster, indem Sie auf das Kreuz in der oberen rechten Ecke klicken. Wählen Sie dann die Datei aus und wählen Sie im oberen rechten Menü die Option Properties :



In diesem Bildschirm können Sie weiterhin die Berechtigungen der Datei und andere Einstellungen anpassen. In den Informationen finden Sie auch die URL der Datei. Kopieren Sie den Link und öffnen Sie ihn in einem Browser, um zu testen, was passiert, wenn Sie versuchen, die Datei herunterzuladen.
Wenn alles korrekt eingerichtet ist, können Sie das nicht tun: Selbst wenn ein zufälliger Besucher die genaue URL Ihrer Downloaddatei kannte, kann er sie nicht herunterladen, indem er die Lizenzprüfung im API-Aufruf überspringt.
Wenn Sie einen Fehler wie diesen sehen, ist alles richtig eingerichtet und Sie können mit dem Erstellen des Codes zum Herunterladen dieser Datei beginnen:



Als letzten Schritt vor der weiteren Codierung erstellen Sie ein Produkt in WordPress mithilfe unseres Lizenzmanager-Plugins (oder aktualisieren ein vorhandenes) und fügen die Informationen der Downloaddatei hinzu:

Download von S3 bereitstellen
Nachdem Sie nun eine Datei erfolgreich auf Amazon S3 hochgeladen haben, geben Sie der Lizenzmanager-API die Datei zurück, wenn Sie dazu aufgefordert werden. Dies ist jedoch nur möglich, wenn die Lizenz des Benutzers gültig ist.
Dazu füllen wir den API-Aktionsplatzhalter aus, den wir unserer API-Behandlungsfunktion handle_request
zuvor in diesem Lernprogramm hinzugefügt haben. Die Aktion überprüft zunächst die Lizenz mit verify_license_and_execute
und erstellt dann mithilfe der offiziellen AWS-Bibliothek von Amazon einen signierten Download-Link zur herunterladbaren Datei des Produkts.
Schritt 1: Laden Sie die AWS Library herunter und fügen Sie sie ein
Laden Sie zunächst das AWS SDK für PHP von Amazon herunter.
Es gibt viele Möglichkeiten, das SDK in Ihr Projekt einzubeziehen. Ich empfehle Ihnen jedoch, den zip-Download in diesem Projekt zu verwenden, auch wenn es bereits ein wenig altmodisch ist: Das SDK enthält Funktionen zur Verwendung aller AWS-Funktionen. Es gibt viele davon - und wir verwenden nur einen, S3. Wenn Sie die ZIP-Version manuell herunterladen und in Ihr Projekt einfügen, haben Sie die Möglichkeit, alle zusätzlichen Dateien zu entfernen, die nur den Speicherplatz des Plugins beanspruchen.
Nachdem Sie das AWS SDK heruntergeladen haben, erstellen Sie ein Verzeichnis mit dem Namen lib
im Verzeichnis wp-license-manager
. Erstellen Sie darin ein Verzeichnis namens aws
, das den Inhalt des ZIP-Pakets des SDK enthält.
Wenn Sie möchten, können Sie jetzt den Inhalt des Verzeichnisses zuschneiden und nur die Verzeichnisse Common
und S3
in Aws
belassen. Wenn die Größe des Plugins kein Problem ist, können Sie diesen Schritt genauso gut überspringen und das SDK so belassen, wie es ist.
Verbinden Sie als Nächstes das AWS SDK mit dem WP License Manager-Plugin auf Codeebene.
Das SDK verwendet Namespaces, eine PHP-Funktion, die nur in PHP 5.3 hinzugefügt wurde. Die offizielle PHP-Anforderung für WordPress ist 5.2.6. Daher kann das SDK nicht für alle WordPress-Benutzer verwendet werden.
Um diese Einschränkung zu umgehen, können Sie eine S3-Bibliothek eines Drittanbieters verwenden oder selbst eine schreiben. Da jedoch die Verwendung des offiziellen SDK generell der empfohlene Weg ist, gehen wir diesmal diesen Weg. In der im WordPress-Plugin-Repository veröffentlichten Version des Plugins habe ich sowohl die AWS SDK-Version als auch eine Fallback-Version mit dieser eigenständigen S3-Bibliothek enthalten. Das Plugin wählt die richtige Version zur Laufzeit aus, basierend auf der PHP-Version des Systems, auf dem das Plugin ausgeführt wird.
In diesem Lernprogramm werden wir jedoch die Dinge ein wenig einfacher halten und nur eine Version des AWS SDK haben.
Erstellen Sie eine neue Klasse, Wp_License_Manager_S3
, und platzieren Sie sie im Include
-Verzeichnis des Plugins:
1 |
<?php
|
2 |
/**
|
3 |
* A wrapper for our Amazon S3 API actions.
|
4 |
*
|
5 |
* @package Wp_License_Manager
|
6 |
* @subpackage Wp_License_Manager/includes
|
7 |
* @author Jarkko Laine <jarkko@jarkkolaine.com>
|
8 |
*/
|
9 |
class Wp_License_Manager_S3 { |
10 |
|
11 |
}
|
Fügen Sie der Klasse Wp_License_Manager
-Funktion load_dependencies
folgende Zeilen hinzu, um die Klasse in das Projekt aufzunehmen
1 |
/**
|
2 |
* A wrapper class for our Amazon S3 connectivity.
|
3 |
*/
|
4 |
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-wp-license-manager-s3.php'; |
5 |
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'lib/aws/aws-autoloader.php'; |
Die erste Zeile enthält die oben erstellte Wrapper-Klasse, und die zweite Klasse enthält den Autoloader des AWS SDK, einen Code, der für die erforderliche Anforderung der SDK-Quelldateien verantwortlich ist.
Schritt 2: Erstellen Sie die Funktion zum Generieren des Downloadlinks
Fügen Sie in der soeben erstellten Klasse Wp_License_Manager_S3
die folgende Funktion zum Generieren eines signierten Download-Links hinzu, der zum Herunterladen der geschützten Datei von Amazon S3 verwendet werden kann:
1 |
/**
|
2 |
* Returns a signed Amazon S3 download URL.
|
3 |
*
|
4 |
* @param $bucket string Bucket name
|
5 |
* @param $file_name string File name (URI)
|
6 |
* @return string The signed download URL
|
7 |
*/
|
8 |
public static function get_s3_url( $bucket, $file_name ) { |
9 |
$options = get_option( 'wp-license-manager-settings' ); |
10 |
|
11 |
$s3_client = Aws\S3\S3Client::factory( |
12 |
array( |
13 |
'key' => $options['aws_key'], |
14 |
'secret' => $options['aws_secret'] |
15 |
)
|
16 |
);
|
17 |
|
18 |
return $s3_client->getObjectUrl( $bucket, $file_name, '+10 minutes' ); |
19 |
}
|
Gehen wir die Funktion durch, um zu sehen, was die ID macht:
Zeilen 11-16: Erstellen Sie eine Amazon S3-Clientklasseninstanz zum Erstellen des Download-Links. Das SDK erfordert AWS-Sicherheitsnachweise, die in WordPress-Optionen gespeichert werden. Dazu wird ein Einstellungsbildschirm verwendet, den wir im nächsten Schritt erstellen.
Zeile 18: Verwenden Sie das SDK, um einen Download-Link für den angegebenen Bucket und Dateinamen zu generieren. Der Download-Link ist ab diesem Moment für 10 Minuten gültig, sodass der Benutzer genügend Zeit hat, um den Download zu starten.
Schritt 3: Erstellen Sie eine Einstellungsseite für AWS-Einstellungen
Wie Sie im vorherigen Schritt bemerkt haben, müssen Sie einen AWS-API-Schlüssel und ein Geheimnis in den WordPress-Optionen speichern, damit das Plugin für die Verwendung mit verschiedenen AWS-Konten konfiguriert werden kann.
Dazu verwenden wir die Einstellungs-API. Das Erstellen einer Einstellungsseite mithilfe der Einstellungs-API besteht aus drei Schritten: Initialisieren der Einstellungsfelder, Hinzufügen der Einstellungsseite und Definieren von Funktionen zum Rendern der verschiedenen Teile der Einstellungsseite.
Alles beginnt mit dem Hinzufügen von zwei Aktionen, einer zu admin_init
und einer zu admin_menu
:
1 |
// Plugin settings menu$this->loader->add_action( 'admin_init', $plugin_admin, 'add_plugin_settings_fields');$this->loader->add_action( 'admin_menu', $plugin_admin, 'add_plugin_settings_page'); |
Nachdem Sie nun die Aktionen hinzugefügt haben, erstellen Sie die Funktionen, um sie zu handhaben. Beide müssen zur Klasse Wp_License_Manager_Admin
hinzugefügt werden.
Fügen Sie zuerst die Funktion add_plugin_settings_fields
hinzu, die einen Einstellungsabschnitt initialisiert, und dann zwei Einstellungsfelder, um darin zu gelangen:
1 |
/**
|
2 |
* Creates the settings fields for the plugin options page.
|
3 |
*/
|
4 |
public function add_plugin_settings_fields() { |
5 |
$settings_group_id = 'wp-license-manager-settings-group'; |
6 |
$aws_settings_section_id = 'wp-license-manager-settings-section-aws'; |
7 |
$settings_field_id = 'wp-license-manager-settings'; |
8 |
|
9 |
register_setting( $settings_group_id, $settings_field_id ); |
10 |
|
11 |
add_settings_section( |
12 |
$aws_settings_section_id, |
13 |
__( 'Amazon Web Services', $this->plugin_name ), |
14 |
array( $this, 'render_aws_settings_section' ), |
15 |
$settings_group_id
|
16 |
);
|
17 |
|
18 |
add_settings_field( |
19 |
'aws-key', |
20 |
__( 'AWS public key', $this->plugin_name ), |
21 |
array( $this, 'render_aws_key_settings_field' ), |
22 |
$settings_group_id, |
23 |
$aws_settings_section_id
|
24 |
);
|
25 |
|
26 |
add_settings_field( |
27 |
'aws-secret', |
28 |
__( 'AWS secret', $this->plugin_name ), |
29 |
array( $this, 'render_aws_secret_settings_field' ), |
30 |
$settings_group_id, |
31 |
$aws_settings_section_id
|
32 |
);
|
33 |
}
|
Zeilen 5-7: Initialisieren Sie drei Variablen mit den Namen des Einstellungsfelds und den Abschnittsnamen. Dies hilft uns sicherzustellen, dass wir keine Tippfehler einfügen ...
Zeile 9: Registrieren Sie das Einstellungselement 'wp-license-manager-settings'
. Es wird ein Array sein, in dem die beiden Einstellungen aws-key
und aws-secret
gespeichert werden.
Zeilen 11-16: Fügen Sie den Einstellungsabschnitt hinzu, der beide Einstellungsfelder enthält.
Zeilen 18-32: Fügen Sie unsere beiden Einstellungsfelder (aws-key
und aws-secret
) hinzu und platzieren Sie sie in dem Einstellungsbereich, der in den Zeilen 11-16 erstellt wurde.
Fügen Sie nun die zweite Funktion add_plugin_settings_page
hinzu. Diese Funktion erstellt die Einstellungsseite als untergeordnetes Element des Hauptmenüs mit der Funktion add_options_page
.
1 |
/**
|
2 |
* Adds an options page for plugin settings.
|
3 |
*/
|
4 |
public function add_plugin_settings_page() { |
5 |
add_options_page( |
6 |
__( 'License Manager', $this->plugin_name ), |
7 |
__( 'License Manager Settings', $this->plugin_name ), |
8 |
'manage_options', |
9 |
'wp-license-settings', |
10 |
array( $this, 'render_settings_page' ) |
11 |
);
|
12 |
}
|
Für jedes der Elemente in den Einstellungen-API-Funktionen (Einstellungsseite, Einstellungsbereich und beide Einstellungsfelder) wird eine Rendering-Funktion als Parameter verwendet.
Um die Einrichtung der Einstellungsseite abzuschließen, erstellen Sie diese Anzeigefunktionen:
1 |
/**
|
2 |
* Renders the plugin's options page.
|
3 |
*/
|
4 |
public function render_settings_page() { |
5 |
$settings_group_id = 'wp-license-manager-settings-group'; |
6 |
require plugin_dir_path( dirname( __FILE__ ) ) . 'admin/partials/settings_page.php'; |
7 |
}
|
8 |
|
9 |
/**
|
10 |
* Renders the description for the AWS settings section.
|
11 |
*/
|
12 |
public function render_aws_settings_section() { |
13 |
// We use a partial here to make it easier to add more complex instructions
|
14 |
require plugin_dir_path( dirname( __FILE__ ) ) . 'admin/partials/aws_settings_group_instructions.php'; |
15 |
}
|
16 |
|
17 |
/**
|
18 |
* Renders the settings field for the AWS key.
|
19 |
*/
|
20 |
public function render_aws_key_settings_field() { |
21 |
$settings_field_id = 'wp-license-manager-settings'; |
22 |
$options = get_option( $settings_field_id ); |
23 |
?>
|
24 |
<input type='text' name='<?php echo $settings_field_id; ?>[aws_key]' value='<?php echo $options['aws_key']; ?>' class='regular-text'> |
25 |
<?php
|
26 |
}
|
27 |
|
28 |
/**
|
29 |
* Renders the settings field for the AWS secret.
|
30 |
*/
|
31 |
public function render_aws_secret_settings_field() { |
32 |
$settings_field_id = 'wp-license-manager-settings'; |
33 |
$options = get_option( $settings_field_id ); |
34 |
?>
|
35 |
<input type='text' name='<?php echo $settings_field_id; ?>[aws_secret]' value='<?php echo $options['aws_secret']; ?>' class='regular-text'> |
36 |
<?php
|
37 |
}
|
Die Rendering-Funktionen für das Einstellungsfeld render_aws_key_settings_field
und render_aws_secret_settings_field
sind im Wesentlichen Kopien voneinander: Zuerst rufen sie die Optionen des Plugins ab und drucken dann ein Textfeld mit Namen und aktuellem Wert der Einstellung aus.
Die Funktionen zum Rendern der Einstellungsseite (render_settings_page
) und des Einstellungsabschnitts (render_aws_settings_section
) sind ähnlich, aber anstatt den HTML-Code direkt in der Funktion zu drucken, verwenden sie separate HTML-Vorlagen. Dies ist keineswegs der einzig richtige Weg - ich habe mich für diesen Ansatz entschieden, da diese Funktionen etwas mehr HTML darstellen und möglicherweise zu einem späteren Zeitpunkt erweitert werden müssen.
Hier geht es um die Vorlagen. Zuerst admin/partials/settings_page.php
, der Teil für die Einstellungsseite:
1 |
<?php
|
2 |
/**
|
3 |
* The view for the plugin's options page.
|
4 |
*
|
5 |
* @package Wp_License_Manager
|
6 |
* @subpackage Wp_License_Manager/admin/partials
|
7 |
*/
|
8 |
?>
|
9 |
|
10 |
<div class="wrap"> |
11 |
<div id="icon-edit" class="icon32 icon32-posts-post"></div> |
12 |
|
13 |
<h2>
|
14 |
<?php _e( 'WP License Manager Settings', $this->plugin_name ); ?> |
15 |
</h2>
|
16 |
|
17 |
<form action='options.php' method='post'> |
18 |
<?php
|
19 |
settings_fields( $settings_group_id ); |
20 |
do_settings_sections( $settings_group_id ); |
21 |
submit_button(); |
22 |
?>
|
23 |
</form>
|
24 |
</div>
|
Der interessante Teil befindet sich am Ende der PHP-Datei, wo wir das Formular erstellen und die Einstellungsfelder, Abschnitte und die Schaltfläche zum Einfügen einfügen.
Der Teil für die Einstellungen (admin/partials/aws_settings_group_instructions.php
) ist derzeit fast leer und gibt eine kurze Zeile Anweisungen aus:
1 |
<?php
|
2 |
/**
|
3 |
* The view for the AWS settings section's description on the plugin's settings page.
|
4 |
*
|
5 |
* @package Wp_License_Manager
|
6 |
* @subpackage Wp_License_Manager/admin/partials
|
7 |
*/
|
8 |
?>
|
9 |
|
10 |
<?php _e( 'Enter your AWS credentials below.', $this->plugin_name ); ?> |
Nun haben wir die Einstellungsseite erstellt. Besuchen Sie das WordPress-Dashboard, um es in Aktion zu sehen:



Schritt 4: Erhalten Sie einen AWS-API-Schlüssel und ein Geheimnis
Um die Funktionalität zu testen, müssen Sie immer noch einen API-Schlüssel und ein Geheimnis von AWS abrufen und in den gerade erstellten Einstellungsfeldern speichern.
Kehren Sie dazu zur AWS-Administrationskonsole zurück und klicken Sie im oberen rechten Menü auf Ihren Namen. Wählen Sie in der angezeigten Dropdown-Liste Sicherheitsberechtigungsnachweise aus.
Als Nächstes wird das folgende Popup angezeigt:



Wählen Sie die Option Erste Schritte mit IAM-Benutzern aus. Auf diese Weise können Sie Ihre globalen Sicherheitsanmeldeinformationen nicht überall verwenden, sondern Sie können separate Benutzernamen (und Zugriffsberechtigungsnachweise) für verschiedene AWS-Anwendungen erstellen, die Sie möglicherweise verwenden.
Erstellen Sie anschließend einen Benutzer, der für Ihre WP License Manager-Installation verwendet werden soll.
Klicken Sie zuerst oben auf der Seite auf Create Users. Geben Sie dann auf der nächsten Seite einen Benutzernamen ein, der für Sie sinnvoll ist (ich habe einfach test_user verwendet, aber eine bessere Option wäre wahrscheinlich der license-manager oder etwas, das Ihnen sagt, wofür der Benutzer verwendet wird) und klicken Sie auf Create .



Der Benutzer wird erstellt und auf der nächsten Seite werden die Sicherheitsanmeldeinformationen angezeigt. Kopieren Sie sie und fügen Sie sie in die Einstellungen ein, die wir im vorherigen Schritt erstellt haben.



Schritt 5: Erstellen Sie die API-Funktion
Jetzt haben wir alle Teile erstellt, die für die get
-API-Aktion erforderlich sind. Lassen Sie uns sie zusammenstellen und die Aktion selbst erstellen.
Füllen Sie zunächst den switch..case
-Block aus, den wir für die get
-Aktion in der handle_request
-Funktion in Wp_License_Manager_API
hinterlassen haben:
1 |
case 'get': |
2 |
$response = $this->verify_license_and_execute( array( $this, 'get_product' ), $params ); |
3 |
break; |
Die Funktion verify_license_and_execute
ist bereits fertiggestellt. Daher müssen Sie lediglich die Handler-Funktion get_product
hinzufügen.
Hier ist die Funktion:
1 |
/**
|
2 |
* The handler for the "get" request. Redirects to the file download.
|
3 |
*
|
4 |
* @param $product WP_Post The product object
|
5 |
*/
|
6 |
private function get_product( $product, $product_id, $email, $license_key ) { |
7 |
// Get the AWS data from post meta fields
|
8 |
$meta = get_post_meta( $product->ID, 'wp_license_manager_product_meta', true ); |
9 |
$bucket = isset ( $meta['file_bucket'] ) ? $meta['file_bucket'] : ''; |
10 |
$file_name = isset ( $meta['file_name'] ) ? $meta['file_name'] : ''; |
11 |
|
12 |
if ( $bucket == '' || $file_name == '' ) { |
13 |
// No file set, return error
|
14 |
return $this->error_response( 'No download defined for product.' ); |
15 |
}
|
16 |
|
17 |
// Use the AWS API to set up the download
|
18 |
// This API method is called directly by WordPress so we need to adhere to its
|
19 |
// requirements and skip the JSON. WordPress expects to receive a ZIP file...
|
20 |
|
21 |
$s3_url = Wp_License_Manager_S3::get_s3_url( $bucket, $file_name ); |
22 |
wp_redirect( $s3_url, 302 ); |
23 |
}
|
Gehen wir die Funktion durch, um zu sehen, was sie bewirkt:
Zeilen 7-10: Lesen Sie die Bucket- und Dateinameneinstellungen aus den Metadaten des Produkts.
Zeilen 12-15: Wenn die Metadaten nicht festgelegt sind, geben Sie eine Fehlerantwort zurück.
Zeile 21: Verwenden Sie das AWS SDK, um eine signierte URL für die herunterladbare Datei des angeforderten Produkts zu erstellen.
Zeile 22: Weiterleitung zur signierten Download-URL bei S3. Wie wir im nächsten Schritt des Tutorials sehen werden, erwartet WordPress, dass diese Anforderung die eigentliche Datei zurückgibt. Daher müssen wir hier ein wenig von unserer JSON-basierten API umleiten und tun, was am besten für WordPress funktioniert.
Sie haben jetzt das Lizenzmanager-Plugin erstellt. Wenn Sie möchten, können Sie den Download auf dieselbe Weise testen, wie wir die Info-Anfrage zuvor getestet haben, um festzustellen, ob alles funktioniert. Statt den Fehler anzuzeigen, den wir beim direkten Zugriff auf die Datei in S3 angezeigt haben, lädt Ihr Browser die hochgeladene ZIP-Datei herunter zu S3.
Fazit
Mit der Fertigstellung der API haben wir das Lizenzmanager-Plugin nun abgeschlossen. Es gibt zwar viele Funktionen, die hinzugefügt werden können, aber die aktuelle Version ist voll funktionsfähig und kann verwendet werden, um Lizenzen erfolgreich abzuwickeln.
Im nächsten und letzten Teil der Tutorialserie werden wir alles zusammenstellen, ein WordPress-Theme erstellen und mit unserem Lizenzmanager-Server nach Updates suchen.