Функция для получения файлов с тем же именем из родительской папки - PullRequest
2 голосов
/ 11 июля 2019

Я создал пользовательские элементы для WPBakery. В файле 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' );
}

Однако, поскольку я создаю больше пользовательских элементов, этот список будет огромным. Я хочу загрузить все файлы с именем init.php в каждую подпапку vc_elements.

Это моя текущая структура папок:

vc_elements
   text-image
      init.php
   text
      init.php

Какой самый чистый способ сделать это?

Ответы [ 4 ]

1 голос
/ 21 июля 2019

Я хочу загрузить все файлы с именем init.php в каждом Подпапка vc_elements.

Предполагая, что вы имеете в виду только непосредственные подкаталоги "vc_elements", вы можете использовать GlobIterator с "*" в качестве подстановочного подкаталога:

$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

При необходимости вы можете преобразовать это в более общую функцию.

1 голос
/ 16 июля 2019

Возможно, что-то подобное будет работать, если предположить, что каталог содержит только подкаталоги с необходимыми элементами.

$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;

}
1 голос
/ 16 июля 2019

Вам необходимо использовать RecursiveDirectoryIterator для сканирования папки и получения всех файлов, которые называются init.php.Ниже приведен код, который вы можете использовать

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;
}

Так что в будущем, если вы добавите в папку какой-либо файл init.php, он будет автоматически выбран getFiles () и включен с использованием require.

0 голосов
/ 15 июля 2019

Не уверен, что файловый конструктор для вашей темы, но если у вас есть папка типа inc или int, сделайте файл с именем vc-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' );
}

Тогда в functions.php

require get_template_directory() . '/inc/vc-functions.php';
...