我正在创建一个WordPress插件,允许用户将排序规则应用于特定模板(页面,存档,单个等)。我正在使用PHP scandir填充页面列表,如下所示:
$files = scandir(get_template_directory());
问题是我将single.php模板保存在'/ single'子文件夹中,因此上述函数不会调用这些模板。
如何在scandir函数中使用多个目录(可能是数组?),还是需要不同的解决方案?
所以基本上我想:
$files = scandir( get_template_directory() AND get_template_directory().'/single' );
我目前的解决方案(不是非常优雅,因为每个循环需要2个):
function query_caller_is_template_file_get_template_files()
{
$template_files_list = array();
$files = scandir(get_template_directory());
$singlefiles = scandir(get_template_directory().'/single');
foreach($files as $file)
{
if(strpos($file, '.php') === FALSE)
continue;
$template_files_list[] = $file;
}
foreach($singlefiles as $singlefile)
{
if(strpos($file, '.php') === FALSE)
continue;
$template_files_list[] = $singlefile;
}
return $template_files_list;
}
答案 0 :(得分:0)
首先,对于您正在做的事情,并没有任何错误。你有两个目录,所以你做两次相同的事情。当然,你可以让它看起来更清洁,避免使用明显的复制粘贴:
$files = array_merge(
scandir(get_template_directory()),
scandir(get_template_directory().'/single')
);
现在只需迭代单个数组。
在您的情况下,递归获取文件列表没有意义,因为可能存在您 想要检查的子目录。如果您 想要递归到子目录中,opendir()
和readdir()
以及is_dir()
将允许您构建递归扫描功能。
您可以使用'.php'
稍微加强array_filter()
过滤器部分。
$files = array_filter($files, function($file){
return strpos($file, '.php');
});
我假设,如果文件以.php
开头,那么您对列表不感兴趣(因为strpos()
将返回{{1}的假值}} 在这种情况下)。我还假设你确定没有中间位置有0
的文件。
赞,.php
,因为您将使用版本控制等。
如果有可能,那么您可能需要稍微加强检查以确保template.php.bak
位于文件名的 end 。