Direkte Datenbankabfragen in WordPress
Wenn Sie einen der Posts, die ich in den letzten, sagen wir, zwei Jahren geschrieben habe, durchgelesen haben, werden Sie wahrscheinlich feststellen, dass ich fast jedes Mal dafür plädiere, verfügbare APIs anstelle von Verzeichnisdatenbankabfragen zu verwenden.
Und die Wahrheit ist, dass ich immer noch in diese Richtung neige. Das heißt, wenn es eine Abstraktion oder eine API gibt, die für etwas Bestimmtes verfügbar ist, dann versuche ich, sie zu verwenden.
Aber in einigen kürzlich durchgeführten Projekten habe ich mit einigen relativ großen Datensätzen gearbeitet (groß im Vergleich zu Datensätzen auf Nicht-Unternehmensebene). Dabei habe ich versucht sicherzustellen, dass die Aktualisierungen der Daten so schnell wie möglich erfolgen.
In Situationen wie dieser, obwohl die WordPress Coding Standards es nicht mögen, finde ich direkte Datenbankabfragen gelegentlich die beste Option, um dies unter bestimmten Bedingungen zu tun.
Verwenden von direkten Datenbankabfragen
Direkte Datenbankabfragen gehören zu den Dingen, die unter WordPress-Entwicklern einen etwas gemischten Ruf haben:
- sie werden in den Codierungsstandards entmutigt,
- WordPress bietet über $wpdb direkten Zugriff auf die Datenbank,
- Es gibt Nuancen bei Datenbankabfragen, die verstanden werden sollten.
Wenn Sie also so etwas sehen :
<?php
private function set_all_scheduled_events_as_public() {
global $wpdb;
// @codingStandardsIgnoreStart
$wpdb->query(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = '%s'
WHERE post_type = '%s'
AND post_status = '%s'
",
'publish',
'tribe_events',
'future') );
// @codingStandardsIgnoreEnd
}
Woher weißt du, ob es ein guter Schritt ist oder nicht? Und noch besser, woher wissen Sie, ob Sie Verzeichnisdatenbankabfragen in Ihrem eigenen Code verwenden sollten?
Es gibt ein paar Fragen, die ich mir normalerweise stelle, wenn ich mich mit ihnen befasse, die alle unten aufgeführt sind.
1 Gibt es Indizes für die Spalten?
Bevor Sie direkte Datenbankabfragen in WordPress verwenden, sollten Sie überprüfen, ob die von mir abgefragten Spalten Indizes für diese Spalten haben.
Und der Grund ist folgender :
Indizes werden verwendet, um Daten schnell zu finden, ohne bei jedem Zugriff auf eine Datenbanktabelle jede Zeile in einer Datenbanktabelle durchsuchen zu müssen.
Unter dem Strich ist die Geschwindigkeit, mit der Sie Spalten abfragen und aktualisieren können, höher, wenn Indizes für die Spalten vorhanden sind.
Direkte Datenbankabfragen hängen von der Struktur der Datenbank ab.
Zu diesem Zweck ist dies nicht etwas, was wir die ganze Zeit tun sollten. Aber es gibt Zeiten, in denen es angemessen ist (z. B. wenn Sie eine Reihe von Metawerten aktualisieren) und in denen nicht.
2 Parametrisieren Sie Ihre Abfragen
Wenn Sie direkte Datenbankabfragen verwenden, ist es aus Sicherheitsgründen äußerst wichtig, Ihre Abfragen zu parametrisieren. Sie können alles darüber im Kodex nachlesen, und das sollten Sie nicht überspringen.
Direkt aus der Dokumentation :
Eine vollständigere Übersicht über SQL-Escapezeichen in WordPress finden Sie unter Datenbankdatenvalidierung. Es ist ein Muss für alle WordPress-Code-Beitragenden und Plugin-Autoren.
Das heißt, wenn Sie Benutzereingaben entgegennehmen, müssen Sie sicherstellen, dass sie bereinigt, sauber und bereit sind, in die Datenbank eingefügt zu werden. Aber für das, was es wert ist, erlaube ich fast nie, dass Benutzereingaben direkte Datenbankabfragen beeinflussen.
Stattdessen basieren sie normalerweise auf Daten, die ich im Code habe und die ich aktualisieren oder ändern möchte, wenn sie sich sicher im Bereich der Kontrolle der Codebasis befinden.
3 Testen Sie sie und testen Sie sie erneut
Und schließlich empfehle ich, bevor Sie direkte Abfragen implementieren:
- Starten Sie Ihr SQL-Frontend und führen Sie die Abfragen aus,
- Beachten Sie alle Fehler, die sie auslösen können,
- Reparieren Sie sie und versuchen Sie es erneut.
Dann, sobald Sie einen funktionierenden Abfragetest für Randfälle haben, um sicherzustellen, dass nichts verstümmelt wird. Dies gilt insbesondere, wenn Sie LIKE-Klauseln in Ihren Abfragen verwenden (was wahrscheinlich ein eigener Artikel ist).
Übersehe ich eine API?
Bei der Größe der WordPress-API besteht immer die Möglichkeit, dass ich etwas verpasse, etwas vernachlässige oder einfach nicht schlau mit den vorhandenen APIs umgehe.
Und wenn das der Fall ist, korrigiere ich gerne die obigen Informationen (also zögern Sie nicht, einen Kommentar zu hinterlassen).
Aber in der Zwischenzeit, wenn Sie mit relativ festgelegten Daten arbeiten, sind Sie sicher, dass es Indizes für die Spalten gibt, Sie wissen, wie Sie die Abfragen parametrisieren, und Sie haben die Daten getestet, dann vielleicht mit direkt Datenbankabfragen sind der richtige Weg.
Und wenn das der Fall ist, gibt es ein paar Möglichkeiten, die Codierungsstandards zu ignorieren, ohne dass der PHP CodeSniffer Sie anschreit. 🙂
