从父文件夹获取同名文件的功能

时间:2019-07-11 07:14:26

标签: php wordpress wpbakery

我已经为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 个答案:

答案 0 :(得分:1)

假设目录仅包含具有所需元素的子目录,则可能会发生这种情况。

$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 :(得分:1)

您需要使用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包括在内。

答案 2 :(得分:1)

  

我想要做的是在每个文件中加载所有名为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

如果需要,显然可以将其转换为更通用的功能。

答案 3 :(得分:0)

不确定文件主题的结构是什么,但是如果您有incint这样的文件夹,请在该文件中创建一个名为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';