我已经为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
最干净的方法是什么?
答案 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)
不确定文件主题的结构是什么,但是如果您有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';