J'ai créé des éléments personnalisés pour WPBakery
. Dans le fichier functions.php
, j'ai actuellement ce qui suit:
vc_elements text-image init.php text init.php
Cependant, à mesure que je construis plus d'éléments personnalisés, cette liste sera énorme. Ce que je cherche à faire est de charger tous les fichiers nommés init.php
dans chaque sous-dossier vc_elements
.
Voici ma structure de dossiers actuelle :
add_action( 'vc_before_init', 'vc_before_init_actions' ); function vc_before_init_actions() { require_once('vc_elements/text-image/init.php' ); require_once('vc_elements/text/init.php' ); }
Quelle est la manière la plus propre de procéder?
4 Réponses :
Je ne sais pas quel est le structeur de fichier pour votre thème, mais si vous avez un dossier comme Puis dans le inc
ou int
créez un fichier appelé vc-functions.php dans ce fichier, faites quelque chose comme ceci.
require get_template_directory() . '/inc/vc-functions.php';
functions.php
add_action( 'vc_before_init', 'vc_before_init_actions' );
function vc_before_init_actions() {
require_once('vc_elements/text-image/init.php' );
require_once('vc_elements/text/init.php' );
}
p >
Peut-être que quelque chose comme ça fonctionnerait, en supposant que ce répertoire ne contienne que des sous-répertoires avec les éléments dont vous avez besoin.
$dir = 'path/to/vc_elements'; // Scan directory for its contents and put in array. Remove possiblity of . or .. $files = array_diff(scandir($dir), array('..', '.')); foreach ($files as $file) { $name = '/path/to/vc_elements/' . $file . '/init.php'; include $name; }
Il vaut peut-être mieux utiliser "include ($ name)" dans cette solution au lieu de "require". Même si 'vc_elements' contient actuellement UNIQUEMENT des dossiers et que chacun de ces dossiers contient TOUJOURS un init.php, un futur développeur peut ne pas remarquer cette restriction et ajouter des fichiers à "vc_elements" ou à des sous-dossiers sans "init.php". Dans ce cas, il y aura être de fausses "demandes" de fichiers entraînant des erreurs fatales (avec "require") mais pas lors de l'utilisation de "include".
Vrai. Je conviens que ce serait mieux. S'ajustera.
Vous devez utiliser RecursiveDirectoryIterator pour analyser le dossier et obtenir tous les fichiers nommés init.php. Voici le code que vous pouvez utiliser
add_action( 'vc_before_init', 'vc_before_init_actions' ); function vc_before_init_actions() { $dir = '/full_path_to_vc_elements'; $files = getFiles($dir, 'init.php'); foreach( $files as $file) { require_once( $file ); } } function getFiles($dir, $match) { $return = array(); $iti = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach($iti as $file){ if ($file->isDir()) { continue; } if(strpos($file , $match) !== false){ $return[] = $file->getPathname(); } } return $return; }
Donc, à l'avenir, si vous ajoutez un fichier init.php dans le dossier, il sera automatiquement sélectionné par getFiles () et inclus à l'aide de require.
Ce que je cherche à faire est de charger tous les fichiers nommés init.php dans chaque Sous-dossier vc_elements.
En supposant que vous ne parliez que des sous-répertoires immédiats de "vc_elements", vous pouvez utiliser GlobIterator avec un "*" comme caractère générique de sous-répertoire:
$myInitFiles = new GlobIterator('/path/to/vc_elements/*/init.php'); foreach ($myInitFiles as $file) { require_once( $myInitFiles->key() ); } unset($myInitFiles); // release object memory for garbage collectionVous pouvez évidemment le convertir en une fonction plus générale si nécessaire.