Über das Schreiben lesbarer WordPress-Funktionen
Eines der Dinge, die ich durchweg interessant finde (sowohl aus Sicht der Programmierung als auch aus Sicht von WordPress), ist Folgendes:
Ich mag es, den Code so zu trennen, dass der Code, der für die Interaktion mit WordPress verantwortlich ist, in seinen Namensraum verbannt wird, während der Rest unseres Codes anderswo angemessen benannt wird.
Ich denke aber, das ist offensichtlich.
Wenn es um das Schreiben von Code geht, bedeutet dies jedoch nicht, dass es einfach der Art und Weise überlassen werden muss, wie wir unsere Klassen schreiben und sie dann organisieren. Was ist mit den Dingen auf einer etwas granulareren Ebene?
Das heißt, was wäre, wenn wir Methoden als Teil des größeren Ganzen betrachten und sicherstellen würden, dass sie ihre Arbeit auch gut machen? Sicher, Leute wie Bob Martin haben den größten Teil ihrer Karriere über diese Art von Zeug geschrieben und es Leuten wie uns gepredigt.
Aber diese Konzepte sind etwas, womit man einfach anfängt und sie dann für immer anwendet. Paradigmenwechsel, wir sind heute besser als gestern, und es kann mehrere Möglichkeiten geben, dasselbe zu erreichen.
Wenn es also darum geht, lesbare WordPress-Funktionen für eine bestimmte Domain zu erstellen, wie könnte das aussehen?
Lesbare WordPress-Funktionen
Für diejenigen, die mit den SOLID- Prinzipien oder allem, was über das Schreiben von gutem Code spricht, vertraut sind, ist eines der Dinge, über die viele dieser Leute schreiben, die Länge, die eine Methode haben sollte.
Ich neige dazu, sie eher als Regeln denn als Gesetz zu betrachten, denn manchmal können Methoden einfach nicht so kurz sein. Ich meine, ich denke, das könnten sie, aber irgendwann fühlt es sich an wie Mikromanagement von Code, oder?
Und etwas zu tun, um es zu tun, ist eine Sache, aber etwas zu tun, um sinnvoll zu programmieren, ist eine andere. Ich entscheide mich jedes Mal für das Spätere.
Wie auch immer, hier ist ein Beispiel: Nehmen wir an, Sie haben einen Code, der über Ajax aufgerufen wird, und bevor Sie mit der Operation fortfahren, müssen Sie wissen, ob ein benutzerdefinierter Beitragstyp vorhanden ist.
Die Schritte, um so etwas zu tun, könnten wie folgt aussehen:
- den Ajax-Aufruf einleiten,
- Überprüfen Sie die Sicherheitsnonce, um sicherzustellen, dass es sich um eine gültige Anfrage handelt.
- prüfen, ob Daten vorhanden sind,
- wenn dies der Fall ist, eine Erfolgsmeldung zurückgeben; wenn nicht, gib eine Fehlermeldung zurück.
All dies kann in einer einzigen Nachricht erledigt werden, sicher, aber nehmen wir an, dass wir dies in einer Reihe von Aufrufen schreiben möchten, die leicht zu lesen sind, wobei der Code bis zu einem gewissen Grad selbstdokumentierend ist (das bedeutet nicht, dass ich bin gegen Kommentare – überhaupt nicht, aber das heißt nicht, dass wir wollen, dass unser Code unklar ist, oder?).
Zuerst der Ajax-Aufruf :
$.get(ajaxurl, {
'action': 'getDetails',
'security': $('input[name="acme-security-nonce"]').val()
}, function(response) {
if (false === response.success) {
// Handle the case when the request wasn't successful.
}
// Work with the information that was returned in the response.data property.
});
Dann haben wir auf der Serverseite eine Funktion zur expliziten Überprüfung der Sicherheits-Nonce (dies setzt natürlich voraus, dass Sie sie im Front-End korrekt einrichten):
<?php
/**
* @return bool true if we're able to make Ajax requests; otherwise, false
*/
private function verifyRequest()
{
return
isset($_GET['security']) &&
wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');
}
Danach wollen wir prüfen, ob Daten vorhanden sind:
<?php
/**
* @return bool true if there are details; false, otherwise
*
* @access private
*/
private function doDetailsExist()
{
return (new WP_Query([
'post_type' => 'acme_post_type',
'post_status' => 'publish',
]))->have_posts();
}
Von hier aus können wir dann mit dem Ajax-Antwortobjekt arbeiten, indem wir seine Erfolgseigenschaft auswerten und entsprechend reagieren.
Einen Schritt weiter gehen
Gehen wir noch einen Schritt weiter und sagen, dass Produkte existieren und wir alle ihre Post-IDs abrufen möchten. Dies mit WP_Query zu tun ist ziemlich einfach, aber nehmen wir an, wir wollen aus Spaß direkt mit der Datenbank kommunizieren.
Beachten Sie, dass dies eher eine Übung ist, um eine Möglichkeit zu zeigen, etwas zu tun, als für die Verwendung von $wpdb über WP_Query zu argumentieren. Das ist Inhalt für einen ganz anderen Beitrag.
Jedenfalls haben wir also festgestellt, dass Daten existieren. Lassen Sie uns also ein Array aller Post-IDs holen und es oder ein leeres Array zurückgeben. Vielleicht sieht das in etwa so aus:
<?php
/**
* @return array a numerically indexed array of all detail IDs
*/
private function getDetailIds(): array
{
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare("
SELECT meta_value
FROM $wpdb->postmeta
WHERE meta_key = %s
ORDER BY meta_value ASC
", 'acme_detail_number'),
ARRAY_N
);
$detailIds = [];
array_push($detailIds, array_map(function ($result) {
return $result[0];
}, $results));
return $detailIds[0] ?? $detailIds;
}
Sobald die Werte zurückgegeben werden, können wir sie nach Belieben bearbeiten.
Was ist der Zweck von all dem?
Im Allgemeinen soll es uns helfen, so über Code nachzudenken, dass wir ihn fast so nah wie möglich am geschriebenen Wort lesen können. Das heißt, wir können auf ein Stück Code verweisen, wie zum Beispiel:
Zuerst werden wir sehen, ob etwas existiert. Wenn nicht, senden wir einen Fehler; andernfalls greifen wir die Daten und bearbeiten sie dann.
Zugegeben, ich rede hier weniger konkret, aber das liegt daran, dass ich nicht unbedingt mehr weiß, womit Sie arbeiten, als Sie über meine Arbeit wissen. Aber du verstehst die Idee, oder?
Wenn Sie darüber hinaus von WordPress entkoppelten Unit-Test-Code suchen, können Sie dies durch die Verwendung von Schnittstellen tun, die die Funktionen simulieren oder sogar direkte Abfragen gegen die Datenbank ausführen, ohne WordPress verwenden zu müssen.
Aber wie bei einigen der oben genannten Punkte ist das Thema für einen anderen Beitrag.
Ich schreibe gerade ein eBook (zusammen mit einer Vielzahl anderer Premium-Inhalte). Wenn Sie interessiert sind, sehen Sie sich an, was Sie bekommen.
