I am creating a WordPress plugin which allows a user to apply sorting rules to a particular template (page, archive, single etc). I am populating list of pages using PHP scandir like so:
$files = scandir(get_template_directory());
The problem is that I keep single.php templates in a ‘/single’ subfolder so these templates are not being called by the above function.
How can I use multiple directories within the scandir function (perhaps an array?) or will I need a different solution?
So basically I am trying to:
$files = scandir( get_template_directory() AND get_template_directory().'/single' );
My current solution (not very elegant as it requires 2 for each loops):
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;
}
First, there’s not really anything wrong about what you’re doing. You have two directories, so you do the same thing twice. Of course you could make it look a little cleaner and avoid the blatant copy paste:
Now just iterate over the single array.
In your case, getting the file list recursively doesn’t make sense, as there may be subdirectories you don’t want to check. If you did want to recurse into subdirectories,
opendir()
andreaddir()
along withis_dir()
would allow you to build a recursive scan function.You could event tighten up the
'.php'
filter part a bit witharray_filter()
.Here I’m assuming that should a file start with
.php
you’re not really interested in it making your list (asstrpos()
will return the falsy value of0
in that case). I’m also assuming that you’re sure there will be no files that have.php
in the middle somewhere.Like,
template.php.bak
, because you’ll be using version control for something like that.If however there is the chance of that, you may want to tighten up your check a bit to ensure the
.php
is at the end of the filename.