2
votes

Fonction pour obtenir des fichiers du même nom à partir du dossier parent

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?


0 commentaires

4 Réponses :


0
votes

Je ne sais pas quel est le structeur de fichier pour votre thème, mais si vous avez un dossier comme 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';

Puis dans le 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 >


0 commentaires

1
votes

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;

}


2 commentaires

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.



1
votes

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.


0 commentaires

1
votes

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 collection

Vous pouvez évidemment le convertir en une fonction plus générale si nécessaire.


0 commentaires