wpdb in eine eigene Klasse

  • Guten Tag,

    ich möchte eine eigene Klasse schreiben die, die $wpdb Variable enthält und zwei Methoden davon Kapselt. Die Klasse sieht wie folgt aus:

    Nun möchte ich zum Anzeigen der Archive Seiten diese Klasse benutzen. Beide Klassen sind in der selben Datei, ich weiß leider nicht wie ich das geändert bekomme. Doch das ist erst einmal nicht das Problem!
    Es funktioniert nicht. Ich erhalte einen Kritischen Fehler!

    PHP
    class Printer {
        private $helper = new Helper();
        private $table_name;
      
        public function create_data($table) {
            $this->table_name = $this->helper->get_prefix() . $table;
            $sql = "SELECT * FROM $this->table_name";
            $this->archiv = $this->helper->get_results($sql);
        }
    }

    Leider kenne ich mich mit PHP nicht so gut aus, in Java z. B. funktioniert ein solches Konstrukt. Ist es vielleicht nicht möglich in PHP eine neue Instanz in einer Klasse zu erstellen? Dann müsste die Helper Klasse vorher initialisiert werden und dem Printer im Construktor übergeben werden.

    Kann mir jemand dabei helfen?

    • 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

  • Das ist nicht mein gewünschtes Ergebnis.
    Ich möchte eigentlich einfach nur ein Objekt in einer Klasse instanziieren. Funktioniert so etwas unter PHP? Darüber finde ich keine Auskunft!

    Mit der Helper Klasse möchte ich nur das $wpdb weg kapseln, es werden mehrere Printer Klassen geben. Ich müsste sonst jedes mal das $wpdb Konstrukt in die verschiedenen Klassen kopieren. Kopierter Code ist misst!

    Wenn das so nicht funktioniert werde ich es Kopieren müssen doch dann werde ich es auch nicht mithilfe von Objekten lösen sondern prozedural weiter arbeiten.

  • Also mein erstes Problem ist, das ich gar nicht weiß ob es überhaupt mit PHP so funktioniert!

    Ich habe gelernt mit Java das ich in einer Klasse eine Instanz einer anderen Klasse erzeugen kann. Das ganze sieht dann wie folgt aus:

    Code
    class Mitarbeiter {
    String vorname, nachname;
    }

    Dieser Mitarbeiter kann nun in einer Abteilung genutzt werden:

    Code
    class Abteilung {
    Mitarbeiter leitung = new Mitarbeiter("Vorname", "Nachname");
    ...
    }

    Funktioniert so etwas ebenfalls auch in PHP? Derzeit habe ich das Gefühl das es schon daran scheitert! Weißt du das zufällig?
    Sinn macht das Beispiel nicht, es geht nur um die Frage ob so etwas Funktioniert. Danach klären wir den rest

  • Du müsstest den Kritischen Fehler den du erhältst übers Error-Log mal genauer anschauen. Dort würdest Du erkennen, dass

    Code
    private $helper = new Helper();

    die Ursache ist.

    Schreib diese Klasse mal so um:

    Wenn auch das nicht geht, schau unbedingt ins Error-Log. Das sagt mehr aus als Java-Logs in solchen Fällen oft ;)

  • Genau das hat den Problem gelöst!
    Ich konnte mir auch nur schlecht vorstellen das ein solches Konzept in PHP nicht funktionieren würde. Nur wird es einem nirgendwo so erklärt!

    Danke für eure Hilfe :-)
    @[size=14]b3317133 wir nutzen die loop auch weiterhin, nur speichern wie die Daten nicht mehr in der Postmeta Tabelle. Wir haben das ganze nicht gut aufgebaut, denn wir rufen für jeden Wert den wir erhalten möchten eine Methode auf, die einen SQL Abfrage an die DB macht und uns diesen Wert zurück gibt. Nun dachte ich, wir lassen uns einfach alle Wert zurück geben speichern die Werte in einem Objekt und beim loop rufen wir nur die Werte ab die im Objekt gespeichert sind. Damit sparen wir Hunderte von doppelte SQL Abfragen.

    Da wir uns leider nicht so gut mit PHP auskennen sind das "nur" Notdürftige Programmierungen. Ich habe bereits begonnen PHP zu lernen, da ich aus der Java Ecke komme ist es ungewohnt doch das macht nix :-) [/SIZE]

  • Dein eigentliches Konzept bzw. Problem ist leider weiterhin unklar.

    Normalerweise nutzt man für Beziehungen und Daten in WordPress sog. Custom Post Types und Custom Taxonomies und bei Bedarf die Custom Fields API für weitere Metadaten inklusive deren intern vorhandene unsichtbare Cache Funktionalitäten.

    Wenn man einzelne Dinge selbst nachbauen und dann doch in WordPress integrieren will, kommt es erfahrungsgemäss oft zu weiteren Problemen, die erst im Verlauf klar werden.

    Daher die Frage nach dem Sinn und Zweck der ganzen Herangehensweise.

  • Die Custom Post Types benutze ich auch.
    Es geht nur darum, das viele Daten gespeichert werden und die alle in PostMeta gelandet sind. Um das zu entzerren habe ich für die CPTs Mitglied, Sportler, Leitung, Athlet und so weiter extra Tabellen in der Datenbank angelegt. In diesen werden alle Daten gespeichert und es wird ein Post angelegt der auf diese Daten zeigt :-)
    Vermutlich auch nicht ganz so Wordpress konform doch anders war es mir nicht klar. Das Problem ist das ich keine Posts lösche sondern immer nur neue Hinzukommen :eek: das bedeutet PostMeta wird nur immer und immer größer.

    Wird es jetzt etwas klarer? Oder ist das misst war ich da gemacht habe?

  • Guten Tag,

    ich möchte eine eigene Klasse schreiben die, die $wpdb Variable enthält und zwei Methoden davon Kapselt. Die Klasse sieht wie folgt aus:

    Der Code ist sinnvoll, aber nicht optimal. Hier sind einige Verbesserungsvorschläge:

    • Verwende keine globalen Variablen, sondern injiziere die Abhängigkeiten in den Konstruktor. Das macht deinen Code testbarer und modularer.
    • Verwende Typdeklarationen für die Parameter und Rückgabewerte deiner Funktionen. Das macht deinen Code sicherer und lesbarer.
    • Verwende aussagekräftige Namen für deine Variablen und Funktionen. Das macht deinen Code verständlicher und wartbarer.

    Mit offenen Augen träumen

  • Ich habe noch ein Problem bei meinem versuch hier. Wenn ich das ganze nun versuche und diese zwei Klassen hier in eine eigene helper.php in das Child Theme packe bekomme ich auf der Seite nur das Menü angezeigt und danach hängt es sich auf!

    Hier einmal die zwei Klassen.

    Ich hab leider keinen guten Weg gefunden als das ganze über eine count Variable zu machen. Was ich hier genau mache ist, ich nehme mir alle Daten aus der Tabelle des Post Type z. B. Mitglied. Dann kommt die Archivseite von der Mitglieder Seit die sieht so aus

    Wenn ich nun oben jedoch in der Mitglied Archiv Seite ein require_once('helper.php'); einfüge hängt sich die Seite auf :-(

    Vermutlich ist das ganze keine schöne Lösung in HTML und PHP jedoch bekomme ich es leider nicht besser hin. Vielleicht kann nochmal jemand drüber schauen und mir weiterhelfen :-)

  • Fehler gefunden hier

    PHP
    protected DatabaseHelper $helper = null;


    muss so lauten

    PHP
    protected  $helper = null;

    Dann klappt es. Kann jemand trotzdem mal drüber schauen und mir nochmal Verbesserungsvorschläge geben?

  • wie schon erwähnt, Wordpress hat für Content Daten (und alles ander) die WP-Tabellen und daher wp-post und wp-postmeta https://codex.wordpress.org/Database_Description, damit man idealst mit den wordpress classen und funktionen weiterarbeiten kann.
    wenn du mit eigenen Tabellen experimentierst, kannst du mit weiteren WP API Funktionen, kaum Lösungen (themen und Plugins) bauen und wir können dir nicht sinnvoll weiterhelfen. Die Verbesserung ist mit den Boardfunktionen, Tabellen usw.. von WordPress zu arbeiten. und sich mit der Development Doku von WordPress (und PHP) zu beschäftigen.

    Wordpress weil es spass macht, besonders beim WordPress Meetup in Linz

  • Vielen Dank für deine Antwort.

    Doch das werde ich so nicht tun, schon aus reinen Performance gründen! Wordpress speichert sämtliche Daten in postmeta und post ab, dass ist ein Problem für mich! Es werden sehr viele Daten gespeichert und es gibt auch viele SQL Abfragen die (über 1 Jahr Erfahrung mit Board WP mitteln) sehr schwer damit abzubilden sind. So werden die SQL Abfragen unnötig Kompliziert, lang und es müssen mehr erzwungen werden. Das kostet alles Zeit und Ressourcen! Gründe genug es anders zu machen.

    Wenn ich Zeit finde werde ich mich nochmal mehr mit dem Thema auseinander setzen, erst einmal baue ich das ganze so jetzt um und Fertig :-) Danach sehe ich weiter.

    Wobei der eigentliche Post sich ja auch mehr auf eine PHP spezifische Frage konzentriert :D nicht wirklich WP Kram sry!

Jetzt mitmachen!

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