Création d'une classe dans un script externe dépendant de l'environnement Wordpress. Comme il s’agit d’une classe que j’ai l’intention d’utiliser dans divers projets, j’ai décidé de créer de manière dynamique un chemin vers wp-blog-header.php et voici ce que j’ai proposé. Cela fonctionne actuellement pour moi, mais je dois m'assurer qu'il est infaillible.
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$scriptName = $_SERVER['SCRIPT_NAME'];
$queryArray = explode("/", $scriptName);
$queryLength = count($queryArray);
require_once($docRoot . ($queryLength > 2 ? "/".$queryArray[$queryLength - 2] : "" ) . '/wp-blog-header.php');
Quelqu'un a-t-il une meilleure solution ou est-il assez bon de s'y fier, quel que soit l'emplacement du script ou la configuration de WP?
Dans le cas générique, il n’existe pas de solution performante autre que la vérification de tous les fichiers et dossiers accessibles au public, puis de tous les dossiers parents.
Comme ce n'est pas une opération réalisable ou excusable à effectuer à chaque chargement ou demande de page, il vous reste deux autres options:
Ce dernier est ce sur quoi vous compterez si vous voulez automatiser les choses.
Problèmes que je vois avec votre code:
Si ces hypothèses vous conviennent, alors oui, votre code est sûr à utiliser
Cependant, je vous recommanderais de transformer votre script externe dans WordPress en tant que plugin.
Selon le Codex,
http://codex.wordpress.org/Integrating_WordPress_with_Your_Website
<?php
require('/the/path/to/your/wp-blog-header.php');
?>
Que vos moyens et votre méthode soient infaillibles dépend entièrement de votre configuration et des emplacements dans lesquels vous placez vos scripts, par rapport à votre installation WordPress.
En supposant que vous respectiez la convention décrite dans votre code, tout devrait bien se passer.
Vous devriez fournir un exemple plus détaillé d'emplacements de script (y compris toutes les variantes possibles), par rapport à un emplacement WordPress. Ainsi, si quelqu'un a quelque chose à ajouter qui peut affiner votre code, il serait alors logique que votre extrait soit localisé en fonction de votre utilisation Cas.
(en réponse à votre commentaire)
Le chemin d'accès à votre installation WordPress est une constante. Par conséquent, au lieu de concevoir quelques astuces pour déterminer où se trouve ce chemin, indiquez-le tel quel et en entier, comme dans l'exemple ci-dessus.
Si, par exemple, votre chemin actuel (pour localhost) ressemble à quelque chose du genre;
c:\Apache\htdcos\wordpress
...puis,
//document root being c:\Apache\htdocs
$_SERVER["DOCUMENT_ROOT"] . '/wordpress/wp-blog-header.php';
Va localiser votre racine de document, pour laquelle vous spécifiez ensuite votre répertoire d'installation et votre fichier wp-blog-header.php
.
Je placerais ensuite un fichier .htaccess
dans c:\Apache\htdocs
qui devrait notamment inclure les éléments suivants,
php_value auto_prepend_file "auto_inc.php" //the auto_inc.php can be a name of choice
Cela inclura (auto_prepend) le fichier auto_inc.php
avant tout autre fichier PHP, donc si vous avez une structure de répertoires comme celle-ci,
..\htdocs\ (root)
..\htdocs\project1\
..\htdocs\project2\
..\htdocs\project-test\sample\
..\htdocs\wordpress\
..\htdocs\.htaccess
..\htdocs\auto_inc.php
..\htdocs\index.php
Le fichier auto_inc.php
sera inclus dans l’un des sous-répertoires, quelle que soit sa profondeur.
Maintenant, dans ce fichier inclus automatiquement, vous pouvez placer une fonction qui englobe la require('/the/path/to/your/wp-blog-header.php');
pour laquelle vous pouvez utiliser arbitrairement dans vos différents projets, par exemple;
function wp_function_include() {
$path = require('/the/path/to/your/wp-blog-header.php');
echo $path;
}
wp_functions_include(); //which fires the verbose require(path..wp-blog-header.php)
Ou bien, vous n'avez pas besoin d'encapsuler la require
et de la disposer dans tous les fichiers, sous-répertoires, à n'importe quelle profondeur, sans avoir à le spécifier à nouveau, ce qui vous permet de vous concentrer sur vos projets.
Étant donné que le répertoire /wordpress/
a déjà son propre .htaccess
, il ne sera pas affecté par le .htaccess
trouvé dans son répertoire racine, ce qui supprimera tout conflit entre deux fonctions déclarées.
Vous avez juste besoin du code suivant à appliquer pour obtenir un chemin réel pour le wp-blog-header.php
$scriptPath = dirname(__FILE__);
$path = realpath($scriptPath . '/./');
$filepath = split("wp-content", $path);
// print_r($filepath);
define('WP_USE_THEMES', false);
require(''.$filepath[0].'/wp-blog-header.php');
Par ailleurs, si vous souhaitez inclure worpdress core (+ fonctions de thème), il est préférable de:
require('/wp-load.php');
et pas
require('/wp-blog-header.php');