J'essaie de me connecter à Wordpress à l'aide de WPDB car c'est une classe magnifique et il existe également des configurations spécifiées dans wp-config.php.
Je vais écrire un petit script séparé de WordPress principal pour qu'il s'exécute en arrière-plan et qu'il soit nécessaire d'utiliser cette instance de WPDB.
Comment puis-je archiver cela?
Toute aide est appréciée.
Le meilleur moyen (le plus rapide et le plus sûr) de charger uniquement la fonctionnalité principale de WordPress consiste à utiliser l'indicateur 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é, vérifiez le code dans /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 rien après cela ne sera chargé, et c'est beaucoup de choses comme vous pouvez le voir. L'encombrement sera beaucoup plus petit que le simple chargement du wp-load.php
et vous donnera toujours accès à toutes les fonctions intégrées du noyau WordPress, contrairement à l'inclusion directe de l'exemple /wp-includes/wp-db.php
. De nombreuses fonctions de WP core ont également des dépendances dans d’autres fichiers et il peut s’avérer désastreux de savoir exactement quels fichiers vous devez inclure pour pouvoir faire ce que vous voulez. SHORTINIT
inclut les dépendances nécessaires pour que vous n'ayez pas à vous en préoccuper.
Si vous savez exactement ce dont vous avez besoin, par exemple uniquement WPDB, le moyen le plus rapide est bien sûr d’inclure uniquement les fichiers dont vous avez besoin, mais SHORTINIT
fournit un moyen plus sûr et plus normalisé de charger le noyau WP et ses dépendances. Avec SHORTINIT
, WordPress ne charge pas les plug-ins, ni la plupart des composants de son API, les thèmes, les fonctions de thème et la plupart des fonctions administratives et frontales. C’est là que le code lourd se trouve dans une installation typique de WordPress. Dans la plupart des cas, je pense que SHORTINIT
vaut le petit compromis vitesse/performance par rapport à l’inclusion des fichiers dont vous avez besoin et c’est dans la plupart des cas un énorme gain de performances comparé à 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 couche d'abstraction de base de données 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'avais écrite, ce qui n'avait rien à voir avec WordPress, mais je ne voulais pas créer un tout nouveau DBA simplement accompagné de ce script.
Étant donné que 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 prendre en charge et l'a ajouté à 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 devez utiliser wpdb
d’ailleurs (dans mon cas, une classe autre que WordPress), vous pouvez utiliser:
$wpdb = DB::getInstance();
de l'intérieur d'une méthode, plutôt que l'horrible global
.
Vous pouvez utiliser $ wpdb dans le nouveau fichier .php qui se trouve dans le dossier du 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 devez simplement inclure le fichier wp-load.php dans votre script.
require('the/path/to/wp-load.php file');
Cela devrait faire l'affaire aussi:
preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
include($path[1] . 'wp-load.php');
vous devriez juste require_once ('../../../ wp-load.php');
et alors vous tous les hooks de classes wordpress et tout sera chargé. maintenant vous pouvez commencer à interecter avec la base de données en utilisant l'instance globale $ wpdb
Les deux étapes suivantes suffisent.
toutes les variables globales que vous pouvez utiliser dans cette page par la suite. Assurez-vous de donner le bon chemin d’inclusion de wp-blog-header.php. Pas besoin d'inclure plusieurs fichiers.
Manière rapide et légère avec une seule ligne est
require (nom de répertoire (FILE_). '/ wp-blog-header.php');
La raison est parce que wordpress initialise le chargement du fichier index.php et lorsque vous vérifiez le fichier index.php, vous voyez:
require (nomdirect (_FILE_). '/ wp-blog-header.php');
Cela charge et bootstrap wordpress.
aussi, pour utiliser wordpress en dehors de l'installation wordpress, créez simplement un nouveau fichier puis écrivez:
require (nomdirect (_FILE_). '/ wp-blog-header.php');
puis pour un test, écrivez: global $ wpdb; var_export ($ wpdb).
alors maintenant vous avez accès à toutes les API wordpress et à l'objet de base de données $ wpdb.