WPDB in eigenständigem Skript verwenden?

Ich versuche, eine Verbindung zu WordPress mit der WPDB herzustellen, weil es eine so schöne class ist und es auch Konfigurationen gibt, die in wp-config.php angegeben sind, so dass ich sie nicht erneut spezifizieren muss.

Ich werde ein kleines getrenntes Skript aus dem Haupt-Wordpress schreiben, das im Hintergrund läuft und diese WPDB-Instanz verwenden muss.

Wie kann ich das archivieren?

Jede Hilfe wird geschätzt.

Die beste (schnellste und sicherste) Möglichkeit, die Hauptfunktionalität von WordPress zu laden, besteht darin, das SHORTINIT Flag folgendermaßen zu verwenden:

 define( 'SHORTINIT', true ); require( '/path/to/wp-load.php' ); //Here you can use WordPress core features, for example the $WPDB object 

Für weitere Informationen und um zu sehen, was geladen ist, überprüfen Sie den Code in /wp-settings.php . Dort finden Sie den folgenden Abschnitt:

 // Stop most of WordPress from being loaded if we just want the basics. if ( SHORTINIT ) return false; 

Dies bedeutet, dass alles danach nicht geladen wird, und es ist eine ganze Menge Dinge, wie Sie sehen können. Der Footprint wird viel kleiner sein als nur das Laden der wp-load.php und bietet Ihnen immer noch Zugriff auf all die eingebauten functionen in WordPress core, im Gegensatz zum Beispiel direkt mit /wp-includes/wp-db.php . Viele functionen im WP-core haben auch Abhängigkeiten in anderen Dateien und es kann ein Durcheinander sein, genau herauszufinden, welche Dateien Sie aufnehmen müssen, um das zu tun, was Sie wollen. SHORTINIT enthält die erforderlichen Abhängigkeiten, sodass Sie sich keine Sorgen machen müssen.

Wenn Sie genau wissen, was Sie brauchen, zum Beispiel nur WPDB, ist der schnellste Weg natürlich, nur die benötigten Dateien SHORTINIT , aber SHORTINIT bietet eine sicherere und standardisiertere Möglichkeit, den WP-core und die Abhängigkeiten zu laden. Mit SHORTINIT WordPress keine Plugins, die meisten Teile der Plugin-API, Themes, Theme-functionen und die meisten Admin- und Frontend-functionen. Dies ist, wo der schwere Code in einer typischen WordPress-Installation ist. In den meisten Fällen denke ich, dass SHORTINIT den kleinen Kompromiss in Geschwindigkeit / performance wert ist, verglichen mit der Aufnahme nur der Dateien, die Sie brauchen, und es ist in den meisten Fällen eine enorme performancessteigerung im Vergleich zu einer Volllast.

 < ?php $path = $_SERVER['DOCUMENT_ROOT']; include_once $path . '/wp-config.php'; include_once $path . '/wp-load.php'; include_once $path . '/wp-includes/wp-db.php'; include_once $path . '/wp-includes/pluggable.php'; // $wpdb is available, do stuff 

WordPress erlaubt Ihnen sogar, Ihren eigenen DBA (databaseabstraktionsschicht) zu verwenden, indem Sie einfach eine Datei namens db.php und diese im Stammverzeichnis Ihres wp-content Verzeichnisses speichern.

Ich hatte das Problem, auf eine database zugreifen zu müssen, über class, die ich schrieb, die nichts mit WordPress zu tun hatte, aber ich wollte nicht einen ganz neuen DBA erstellen, nur mit diesem Skript gehen.

Da die Standard- WPDB es nicht erlaubt, das Factory-Muster zu verwenden, habe ich schnell ein paar Zeilen geschrieben, um es zu unterstützen, und es zu db.php hinzugefügt …

 < ?php class DB extends wpdb { protected static $instance = null; public static function getInstance() { if (!self::$instance) { self::$instance = new DB(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST); } return self::$instance; } } $wpdb = DB::getInstance(); 

Nun, wenn Sie wpdb von woanders verwenden müssen (in meinem Fall eine Nicht-WordPress-class), können Sie Folgendes verwenden:

 $wpdb = DB::getInstance(); 

eher aus einer Methode als aus dem schrecklichen global .

Sie können $ wpdb in der neuen .php-Datei verwenden, die sich im Theme-Ordner befindet, indem Sie den folgenden Code verwenden.

 $url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; $url = $_SERVER['REQUEST_URI']; $my_url = explode('wp-content' , $url); $path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0]; include_once $path . '/wp-config.php'; include_once $path . '/wp-includes/wp-db.php'; include_once $path . '/wp-includes/pluggable.php'; global $wpdb; 

Sie müssen nur die Datei wp-load.php in Ihr Skript einfügen.

 require('the/path/to/wp-load.php file'); 

Dies sollte auch den Trick tun:

  preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path); include($path[1] . 'wp-load.php'); 

Sie sollten nur require_once (‘../../../ wp-load.php’);

und dann wirst du alle wordpress-klassen haken und alles wird geladen. Jetzt können Sie interect mit der database starten, indem Sie global $ wpdb verwenden und die wpdb-Instanz wird gestartet

Nach zwei Schritten sind genug.

  1. Fügen Sie die Datei wp-blog-header.php hinzu
  2. Bevor Sie $ wpdb verwenden, müssen Sie als global $ wpdb;

Alle globalen Variablen, die Sie danach auf dieser Seite verwenden können. Stellen Sie sicher, dass Sie den korrekten Include-Pfad von wp-blog-header.php angeben. Keine Notwendigkeit, mehrere Dateien einzuschließen.

Schneller und leichter Weg mit nur einer einzigen Linie

require (dirname ( _FILE__ ). ‘/ wp-blog-header.php’);

Grund dafür ist, dass WordPress das Laden der index.php initialisiert und wenn Sie die index.php überprüfen, sehen Sie:

require (dirname ( __FILE__ ). ‘/ wp-blog-header.php’);

Dies lädt und bootstrap WordPress.

Um wordpress außerhalb der WordPress-Installation zu verwenden, erstellen Sie einfach eine neue Datei und schreiben Sie dann:

require (dirname ( __FILE__ ). ‘/ wp-blog-header.php’);

Schreiben Sie dann für einen Test: global $ wpdb; var_export ($ wpdb).

Jetzt haben Sie Zugriff auf alle WordPress API und das databaseobjekt $ wpdb.