Klasse WP_Widget: Abspeichern von Änderungen ?

  • Hallo Ihr,

    gibt es eine Methode, mit welcher in der Funktion update() des von der Klasse WP_Widget abgeleiteten Widgets geänderte Optionen in einer eigenen Datenbanktabelle gespeichert werden können ? Ich habe diverse Methoden ausprobiert, aber die richtige bisher nicht gefunden.

    Was passiert, wenn im Aufruf des Widgets im Admin-Bereich der Homepage (Design > Widgets) der Speichern-Button betätigt wird. Diesen Button programmiert man ja nicht selbst.

    maksimilian

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Welche Methoden hast Du ausprobiert?

    Würde empfehlen, das Beispiel im Codex als Basis zu verwenden, die Parameter sind dort klar erklärt. Wenn man "Speichern" klickt, wird update() aufgerufen.

  • @ b3317133 #2

    Ich hatte u.a. versucht, in der Funktion update() der Widget-Definition eine eigene Prozedur aufzurufen, was nicht funktionierte (der NetBeans Trace steuert den gesetzten Haltepunkt in dieser Prozedur nicht an). Außerdem hatte ich mir aus den WP_Widget Methoden einige herausgesucht, deren Name nach "Sichern" aussieht wie update_callback(), save_settings(). Gut, dann versuche ich es nochmal mit update(). Ich dachte bisher, dass update() nur den Refresh der im Widget angezeigten Daten vornimmt. Ich habe im Internet bisher immer nur dieses von Dir zitierte Beispiel für update() gefunden. Mich irritiert, dass dort nie ein Abspeichern von Daten demonstriert wird.

    Wird die update-Methode von der Betätigung des Speichern-Buttons ausgelöst ?

  • Wenn man "Speichern" klickt, wird update() aufgerufen.

    Wenn Dein Widget lt. WordPress-Standard implementiert ist, speichert und lädt es die Daten automatisch, ohne eigene Datenbank-Tabelle.

  • Wenn man "Speichern" klickt, wird update() aufgerufen.

    Wenn Dein Widget lt. WordPress-Standard implementiert ist, speichert und lädt es die Daten automatisch, ohne eigene Datenbank-Tabelle.

    Das dachte ich mir bereits. In meinem jetzigen Fall handelt es sich aber um eine eigene Tabelle. Vielleicht kann ich das Standard Widget deshalb nicht verwenden.

  • Was genau hindert Dich daran, widget(), form() und update() zu verwenden, um darin Daten aus einer eigenen Tabelle zu lesen bzw. zu speichern?

    Und was genau hast Du bereits ausprobiert und was daran hat nicht funktioniert?

  • Was genau hindert Dich daran, widget(), form() und update() zu verwenden, um darin Daten aus einer eigenen Tabelle zu lesen bzw. zu speichern?

    Und was genau hast Du bereits ausprobiert und was daran hat nicht funktioniert?

    Wenn ich es richtig verstehe, werden die Optionswerte in $instance transportiert. Wenn ich den Standard von WP_Widget, die Optionen in der Tabelle wp_options abzuspeichern, nicht verwende, habe ich das Problem, $instance zu versorgen. Die Methode update() erhält die geänderten Optionswerte in $new_instance, bei mir bisher nicht, wenn update() nach Speichern aufgerufen wird (was jetzt der Fall ist). Ich habe den Eindruck, dass die Verwendung des Standardwidgets WP_Widget nicht geeignet ist, wenn man einen eigenen Speicherort für die Optionen einführen will.

  • Wenn Du die Daten in eine eigene Tabelle einfügen willst, würde ich nur die Datenbankanbindung von WP benutzen und den Rest wie die create, update, delete Aktionen selber machen. Da ersparst Du dir viel Zeit dich mit den verschleierten Funktionen und Klassen herumzukämpfen.

    Ich mache meistens eine Model, Factory und Action Klasse, somit ist alles schön getrennt und man weis genau wo man was finden kann und ohne grosse Doku versteht fast jeder was die Klasse macht oder wie man diese anwendet. Aber das ist natürlich Geschmacksache.

    Einmal editiert, zuletzt von strub (23. Mai 2017 um 17:01)

  • Wenn Du die Daten in eine eigene Tabelle einfügen willst, würde ich nur die Datenbankanbindung von WP benutzen und den Rest wie die create, update, delete Aktionen selber machen. Da ersparst Du dir viel Zeit dich mit den verschleierten Funktionen und Klassen herumzukämpfen.

    Ich mache meistens eine Model, Factory und Action Klasse, somit ist alles schön getrennt und man weis genau wo man was finden kann und ohne grosse Doku versteht fast jeder was die Klasse macht oder wie man diese anwendet. Aber das ist natürlich Geschmacksache.

    Vielleicht hilfst Du mir etwas auf die Sprünge. Sind Model, Factory und Action eingeführte Begriffe ? Kannst Du mir einen Link auf Beispiele geben ?

    Als Datenbankschnittstelle verwende ich dbDelta.

  • Die Methode update() erhält die geänderten Optionswerte in $new_instance, bei mir bisher nicht, wenn update() nach Speichern aufgerufen wird (was jetzt der Fall ist)..

    Poste doch mal Deinen Code von form() und update().

    Als Datenbankschnittstelle verwende ich dbDelta.


    dbDelta wird bei WordPress zum Erstellen oder Modifizieren der Struktur von Datenbanktabellen bei z.B. Plugin- oder Core-Updates verwendet. Zum Speichern/Lesen von Daten in diesen Tabellen verwendet man wpdb.

    Einmal editiert, zuletzt von b3317133 (23. Mai 2017 um 22:51)

  • @ b3317133 #10

    Ich habe mal weitergetestet, auch im Vergleich mit einem Beispiel-Plugin, und sehe jetzt klarer. Für eine Übergangszeit werde ich einen Kompromiss eingehen, um endlich weiterzukommen. Ich verwende noch WP_Widget, toleriere den Eintrag in Tabelle wp_options und speichere die Daten in einer eigenen Tabelle (wobei es sich um Daten auch anderer im Plugin verwendeter Objekte als dem Widget handelt).

    Meine Bemerkung zur verwendeten DB-Schnittstelle war nicht korrekt. Ich verwende schon wpdb. Zur Einrichtung einer Tabelle wird dabei die Funktion dbDelta aufgerufen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!