从母文件夹获取同名文件的函数

在 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' );}

然而,当我构建更多的自定义元素时,这个列表太大了。我要做的是在每个 vc_elements 子文件夹中加载所有名为 init.php的文件。
这是我目前的folder 结构:

vc_elements
   text-image
      init.php
   text
      init.php

最简洁的方法是什么?

假设目录只包含您需要的元素的子目录,那么类似这样的操作可能会奏效。

$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';
  require($name);
}

您需要使用 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 ()将自动选择它

What I'm looking to do is load all files named init.php in each vc_elements subfolder.
我要做的是在每个 vc elements 子文件夹中加载所有名为 init.php 的文件。
假设您指的是“ vc 元素”的直接子目录,那么可以使用带有“ * ”的 globaliterator 作为子目录通配符:

$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

显然,如果需要,您可以将其转换为 general function。

不确定你的主题的文件结构是什么,但是如果你有一个文件夹,比如 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';