Utilisation de WPDB dans un script autonome?
J'essaie de me connecter à Wordpress en utilisant le WPDB car c'est une si belle classe et il y a aussi des configurations spécifiées dans wp-config.php donc je n'aurai pas besoin de le spécifier à nouveau.
Je vais écrire un petit script séparé de wordpress principal à exécuter en arrière-plan qui devra utiliser cette instance WPDB.
Comment puis-je archiver cela?
Toute aide est appréciée.
9 réponses
Le meilleur moyen(le plus rapide et le plus sûr) de charger uniquement les fonctionnalités de base de WordPress est d'utiliser le drapeau SHORTINIT
comme ceci:
define( 'SHORTINIT', true );
require( '/path/to/wp-load.php' );
//Here you can use WordPress core features, for example the $WPDB object
Pour plus d'informations à ce sujet et voir ce qui est chargé, est de vérifier le code de /wp-settings.php
. Vous y trouverez la section suivante:
// Stop most of WordPress from being loaded if we just want the basics.
if ( SHORTINIT )
return false;
Cela signifie que tout ce qui suit ne sera pas chargé, et c'est beaucoup de choses comme vous pouvez le voir. L'empreinte sera beaucoup plus petite que le simple chargement du wp-load.php
et vous donnera toujours accès à tous toutes les fonctions intégrées dans WordPress core, contrairement à y compris par exemple /wp-includes/wp-db.php
directement. De nombreuses fonctions dans WP core ont également des dépendances dans d'autres fichiers et il peut être un gâchis de comprendre exactement quels fichiers vous devez inclure pour pouvoir faire ce que vous voulez. SHORTINIT
inclut les dépendances nécessaires afin que vous n'ayez pas à vous inquiéter à ce sujet.
Si vous savez exactement ce dont vous avez besoin, par exemple seulement WPDB, le moyen le plus rapide est bien sûr d'inclure uniquement les fichiers dont vous avez besoin, mais SHORTINIT
fournit un manière plus sûre et plus standardisée de charger le noyau WP et les dépendances. Avec SHORTINIT
WordPress ne charge pas les plugins, la plupart des parties de l'API de plugin, les thèmes, les fonctions de thème et la plupart des fonctions admin et frontend. C'est là que le code lourd est dans une installation WordPress typique.
Dans la plupart des cas, je pense que SHORTINIT
vaut le petit compromis en vitesse/performance par rapport à inclure uniquement les fichiers dont vous avez besoin et c'est dans la plupart des cas un énorme gain de performance par rapport à une charge complète.
<?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 vous permet en fait d'utiliser votre propre DBA (database abstraction layer) simplement en créant un fichier appelé db.php
et en l'enregistrant à la racine de votre répertoire wp-content
.
J'ai eu le problème d'avoir besoin d'accéder à une base de données via la classe que j'ai écrite, qui n'avait rien à faire avec WordPress, mais je ne voulais pas créer un tout nouveau DBA juste aller avec ce script.
Puisque la valeur par défaut WPDB
Ne vous permet pas d'utiliser le modèle d'usine, j'ai rapidement écrit quelques lignes pour le supporter, et ajouté il à db.php
...
<?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();
Maintenant, lorsque vous avez besoin d'utiliser wpdb
d'ailleurs (dans mon cas une classe Non-WordPress), vous pouvez utiliser juse:
$wpdb = DB::getInstance();
À Partir de l'intérieur d'une méthode plutôt que l'horrible global
.
Vous pouvez utiliser $wpdb dans new .fichier php qui est à l'intérieur du dossier de thème, en utilisant le code suivant.
$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;
Vous avez juste besoin d'inclure le wp-load.fichier php dans votre script.
require('the/path/to/wp-load.php file');
Cela devrait faire l'affaire:
preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
include($path[1] . 'wp-load.php');
Vous devriez juste require_once('../../../wp-load.php');
Et puis vous tous les crochets de classes wordpress et tout sera chargé. maintenant, vous pouvez commencer à interagir avec la base de données en utilisant global $wpdb et l'instance wpdb sera démarrée
Les deux étapes suivantes suffisent.
- Inclure le wp-blog-en-tête.fichier php
- avant d'utiliser le $wpdb, mettez comme global $wpdb;
Toutes les variables globales que vous pouvez utiliser dans cette page après cela. Assurez-vous de donner le chemin d'inclusion correct de wp-blog-header.php. Pas besoin de les inclure plusieurs fichiers.
Moyen rapide et léger avec une seule ligne est
Require(dirname(_FICHIER__)."/wp-blog-tête.php');
La raison en est que wordpress initialise le chargement de l'index.php et quand vous vérifiez l'index.php, vous voyez:
Require(dirname(__FICHIER__)."/wp-blog-tête.php');
Cela charge et Bootstrap wordpress.
Donc, pour utiliser wordpress en dehors de l'installation wordpress, créez simplement un nouveau fichier, puis écrivez :
Require(dirname(__FICHIER__)."/wp-blog-tête.php');
Ensuite, pour un test, écrivez: global $wpdb; var_export ($wpdb).
Vous avez donc maintenant accès à toutes les API wordpress et à l'objet de base de données $wpdb.