2

我已经为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

4 回答 4

1

我要做的是在每个 vc_elements 子文件夹中加载所有名为 init.php 的文件。

假设您仅指“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

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

于 2019-07-21T15:07:52.140 回答
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 将其包含在内。

于 2019-07-16T05:15:04.553 回答
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;

}
于 2019-07-15T22:25:54.987 回答
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';
于 2019-07-15T14:51:32.403 回答