Ist es eine schlechte Praxis, eine eigene Tabelle für ein Plugin zu erstellen?

11

Wenn ich Einstellungen für mein Plugin speichern möchte, ist dies ziemlich einfach und unkompliziert.

Jetzt möchte ich etwas mehr in der Datenbank speichern.

Ein Dateiname und 3 weitere Werte, die nur für diese Datei gelten. Und es gibt viele Dateien mit diesen Werten. Ist es möglich, Subarrays mit integrierten Datenbankmethoden zu speichern? Wie kann ich sie löschen usw. sortieren?

Badr Hari
quelle

Antworten:

13

Ich bin selten anderer Meinung als sonst sachkundige Benutzer, aber in diesem Fall kann ich nichts dagegen tun. Meiner Meinung nach ist es einfach falsch, die Verwendung von Nicht-Core-Datenbanktabellen per se als schlechte Praxis zu bezeichnen.

Die Wahl, ob Sie sich für Kerntabellen entscheiden oder eigene hinzufügen möchten, hängt von mehreren Faktoren ab.

Die Ausführungszeit einer Abfrage hängt von der Größe der Tabelle ab. Wenn Sie also vorhaben, erhebliche Datenmengen zu speichern, ist eine separate Tabelle, die nur diesen einen Typ eines bestimmten Datensatzes berücksichtigt, zwangsläufig die effizientere Lösung.

Wenn Sie eine Menge von regelmäßigen Beiträgen oder CPTs neben dieser spezifischen Datensätze speichern, wp_postssowie wp_postmetaschnell wachsen.

Für mich hängt diese Wahl letztendlich davon ab, wie "posty" die Daten sind. Sollte es einen Autor, Kommentare, Überarbeitungen, Auszüge oder ähnliches unterstützen? Wenn ja, werde ich mit CPTs und / oder Kernfunktionalität gehen. Wenn nicht, werde ich aus Gründen der Ressourcennutzung und Effizienz mit separaten Tabellen arbeiten.

Wenn Eugenes Vorstellung richtig wäre, würde keines der vorhandenen gut geschriebenen Plugins seine eigenen Tabellen hinzufügen, was zum Glück nicht der Fall ist.

Johannes Pille
quelle
Ich kann das nicht unterstützen. " Womit Sie sich am wohlsten fühlen " ist absolut keine gültige Überlegung. Es gibt gültige Anwendungsfälle für die Verwendung separater Tabellen, aber für die überwiegende Mehrheit der Plugins schreibt die Best Practice die Verwendung von WP-Kerntabellen vor.
Chip Bennett
2
Fair enuff @ChipBennett - das sollte nicht Teil der Argumentation sein oder ist überhaupt nicht "Argumentation". Bearbeitet und entfernt (ich erwarte immer noch keine positive Abstimmung - Vertreter sind sowieso nicht die einzige Motivation).
Johannes Pille
1
+1. Ich denke, es ist eine vernünftige, gut durchdachte Antwort. :)
Chip Bennett
5

Die Verwendung von WP-Core-DB-Tabellen ist eine bewährte Methode

  1. Durch die Verwendung von Kern-DB-Tabellen werden Ihre Daten portabler und einfacher zu sichern, da sie sowohl vom Kernexporteur / -importeur als auch von den unzähligen Sicherungs-Plugins verarbeitet werden
  2. Durch die Verwendung von DB-Kerntabellen können Ihre Daten einfacher und sicherer bearbeitet werden , da Sie intuitiver auf die verschiedenen WordPress-Kernfunktionen zugreifen können, die sich auf das Abfragen, Hinzufügen, Ändern, Löschen und Bereinigen von DB-Daten beziehen, insbesondere über die sehr leistungsstarke $wpdbKlasse .
  3. Die Verwendung von DB-Kerntabellen fördert / erleichtert Best Practices für die Klassifizierung und Speicherung von Daten , z. B. das Speichern von Plugin-Optionen als Array in einer einzelnen Zeile wp_optionsund das Erzwingen, dass der Plugin-Entwickler die Art der erstellten / gespeicherten Daten sorgfältig überlegt CPT? ist es eine Taxonomie? ist es Post Meta?
  4. Es ist weniger wahrscheinlich, dass Ihr Plugin Cruft hinterlässt, wenn Sie Core-DB-Tabellen verwenden.

WordPress bietet Plugins die Möglichkeit, Tabellen zu ihrer Datenbank hinzuzufügen

Verwenden Sie jedoch in Anwendungsfällen, in denen eine separate DB-Tabelle erforderlich ist, die von WordPress bereitgestellte Methode zum Hinzufügen Ihrer benutzerdefinierten Tabelle zur WordPress-Datenbank , insbesondere, damit Sie die leistungsstarke $wpdbKlasse nutzen können. Beachten Sie die Informationen / Vorbehalte, die in diesem Codex-Eintrag aufgeführt sind:

  • Einrichtungsinformationen - Benutzeroptionen, die eingegeben werden, wenn der Benutzer Ihr Plugin zum ersten Mal einrichtet , und nicht wesentlich darüber hinauswachsen (z. B. in einem tagbezogenen Plugin die Auswahlmöglichkeiten des Benutzers hinsichtlich des Formats der Tag-Cloud in die Seitenleiste). Setup-Informationen werden im Allgemeinen mithilfe des WordPress-Optionsmechanismus gespeichert.

  • Daten - Informationen, die hinzugefügt werden, wenn der Benutzer Ihr Plugin weiterhin verwendet. Dies sind im Allgemeinen erweiterte Informationen zu Posts, Kategorien, Uploads und anderen WordPress-Komponenten (z. B. in einem statistischen Plugin die verschiedenen Seitenaufrufe, Verweise und andere Statistiken, die mit jedem Beitrag auf Ihrer Website verknüpft sind). Daten können in einer separaten MySQL-Tabelle gespeichert werden, die erstellt werden muss. Bevor Sie jedoch mit einer völlig neuen Tabelle beginnen, sollten Sie überlegen, ob das Speichern der Daten Ihres Plugins in WordPress 'Post Meta (auch bekannt als benutzerdefinierte Felder) funktionieren würde. Post Meta ist die bevorzugte Methode. benutze es wenn möglich / praktisch.

Somit können wir folgendes schließen:

  1. Das Speichern von Daten (Setup oder benutzergeneriert) in zentralen WP-Tabellen ist eine bewährte Methode
  2. Es gibt gültige Anwendungsfälle zum Erstellen benutzerdefinierter DB-Tabellen. Daher kann das Erstellen benutzerdefinierter DB-Tabellen nicht als inhärente schlechte Praxis angesehen werden
  3. Beim Erstellen benutzerdefinierter DB-Tabellen bietet WordPress eine Best-Practice-Implementierung
Chip Bennett
quelle
Ich kann das positiv bewerten. ;-) +1 für explizite Erwähnung $wpdb(die Verwendung mit Nicht-Core-Tabellen war in meiner Antwort impliziert, möchte diese Klasse nicht verpassen)
Johannes Pille
2
Ich hatte ursprünglich angenommen, dass "eigene DB-Tabellen" Tabellen außerhalb der WP-Datenbank implizierten . Sobald ich die Sackgasse dieser falschen Annahme überwunden hatte, wurde die Frage (und die Antworten / Kommentare) klarer. :)
Chip Bennett
1

Nicht-Kerndatenbanktabellen sind ein Muss, wenn Ihre Daten komplexer als das WordPress-Postmodell sind, sie riesig werden und viele Metadetails enthalten, die durchsucht werden.

Das EAV-Format, das WordPress für sein Post-Meta verwendet, eignet sich nicht gut für die Suche nach mehreren Kriterien.

Wenn Sie Ihr Meta in viele Einträge unterteilen, haben Sie zahlreiche Einträge pro Beitrag in der Beitrags-Metatabelle, und das Durchsuchen von Beiträgen über Metas ist viel langsamer.

Wenn Sie alle in einem Array serialisierten Metas speichern und nur einen Eintrag im Post-Meta haben, müssen Sie diesmal nur Textsuchen in diesem Meta durchführen, und Sie können Vergleichsoperatoren nicht direkt in Ihrer SQL-Abfrage verwenden.

Kein großes Problem, wenn Ihr Plugin nicht Tausende von Einträgen und zugehörigen Meta enthält.

Aber ein großes Problem, wenn Ihr Plugin etwas Großes tun wird.


Ihre Situation, ein Dateiname als unabhängiger Eintrag und 3 Metadateneinträge, die an diesen Eintrag angehängt sind, scheinen nicht so groß zu sein. Sie können dafür die WordPress-Post-Tabelle und die Meta-Tabelle verwenden.

ABER, wenn Leute viel nach diesen 3 Metas suchen, INSBESONDERE in Verbindung, dann würde ich empfehlen, dass Sie separate Tabellen einrichten.

Mit diesem Format wäre nur eine Tabelle mit nur einem Eintrag, der auch alle Metas enthält, in Ordnung und würde blitzschnell abfragen.

Wenn Sie WordPress-Tabellen verwenden und auch das Abfrage-Caching verwenden, wird der Benutzer, der nach Ihren Daten sucht, im Laufe der Zeit zwischengespeichert und weniger belastet. Aber das wäre nicht so umsichtig wie separate Tabellen.

Einheit100
quelle
0

Sie können Ihre Dateien in die Medienbibliothek hochladen. Jedes Element in der Medienbibliothek wird in einer wp_postsTabelle gespeichert . Dies bedeutet, dass jede Datei Metadaten enthalten kann. wp_postmetaMithilfe der Metadaten-API können Sie für jede Datei in der Tabelle so viele Informationen speichern, wie Sie benötigen .

Ist es eine schlechte Praxis, eine eigene Tabelle für ein Plugin zu erstellen?

Ja, es ist eine schlechte Praxis, eine eigene Tabelle zu erstellen, wenn Sie stattdessen die Kernfunktionalität verwenden können.

Eugene Manuilov
quelle
3
Nein, das ist keine schlechte Praxis. Es sei denn, Sie halten langsamere Abfragen und eng gekoppelten Code für eine gute Vorgehensweise.
Onetrickpony
0
class TMM {

    public static $options;

    public static function register() {
        self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
    }

    public static function get_option($option) {
        return @self::$options[$option];
    }

    public static function update_option($option, $data) {
        self::$options[$option] = $data;
        update_option($prefix . 'theme_options', self::$options);
    }

    //ajax
    public static function change_options() {

        $action_type = $_REQUEST['type'];
        $data = array();
        parse_str($_REQUEST['values'], $data);
        $data = self::db_quotes_shield($data);

        if (!empty($data)) {
            foreach ($data as $option => $newvalue) {
                if (is_array($newvalue)) {
                    self::update_option($option, $newvalue);
                } else {
                    $newvalue = stripcslashes($newvalue);
                    $newvalue = str_replace('\"', '"', $newvalue);
                    $newvalue = str_replace("\'", "'", $newvalue);
                    self::update_option($option, $newvalue);
                }
            }
        }
        _e('Options have been updated.', TMM_THEME_FOLDER_NAME);
        exit;
    }

    public static function db_quotes_shield($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                if (is_array($value)) {
                    $data[$key] = self::db_quotes_shield($value);
                } else {
                    $value = stripslashes($value);
                    $value = str_replace('\"', '"', $value);
                    $value = str_replace("\'", "'", $value);
                    $data[$key] = $value;
                }
            }
        }

        return $data;
    }

}

  • Der Name der Klasse ist original. Benennen Sie ihn nach Ihren Wünschen um.
  • In Funktionen php add: add_action ('init', Array ('TMM', 'register'), 1);
  • Und füge für ajax hinzu: add_action ('wp_ajax_change_options', array ('TMM', 'change_options'));
  • Um eine Option zu erhalten, wo Sie sie benötigen, verwenden Sie diese (zum Beispiel): $ logo_img = TMM :: get_option ('logo_img');
  • Verwenden Sie diese Option, um Ihre Optionen mit nativen WordPress-Methoden zu speichern
Realmag777
quelle