0

下面的脚本旨在获取定义为“WIDGET”的每个文件夹并遍历其文件,将其内容作为小部件对象加载到数据库中。

它工作正常,但是,正如您在下面看到的,对于我想要执行此例程的小部件文件夹中的每个文件夹,我必须创建一个几乎相同的代码的单独分支,用硬编码的 DEFINE 语句播种包含该小部件对象的小部件内容的文件夹的路径。例如,该小部件对象的文件夹名称 (WIDGET) 和 $sidebar_id(它们是相同的)。

由于我在“widgets”目录中命名我的文件夹,与我在数据库中注册的“widgets”相同,我想将此例程转换为一个动态的例程,循环遍历“widgets”文件夹内的目录和对于它找到的每个文件夹,执行以 DEFINE 语句开头的代码。

我如何将其转换为对“小部件”文件夹内的任何文件夹执行的单个例程?

//Install Wigets
$sidebars_widgets = get_option('sidebars_widgets');
$widget_id = count($opts)+1;
$widget_ops = get_option('widget_text');

//1st Widget Area
//make this directory pointer dynamic based on which folder under widgets we are currently working on
DEFINE ('WIDGET', ABSPATH.'/wp-content/plugins/myplugin/widgets/home-header-area/'); 
$directory_widgets = new DirectoryIterator(WIDGET); 
foreach ($directory_widgets as $files_widgets) {
    if ($files_widgets->isFile()) {
        $file_name_widget = $files_widgets->getFilename();
        $widget_text = file_get_contents(WIDGET. $file_name_widget);
        $sidebar_id = 'home-header-widget'; //make this dynamic based on the current foldername in the loop
        $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
        $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
        update_option('widget_text', $widget_ops);  
        update_option('sidebars_widgets', $sidebars_widgets);
    }
}

//2nd Widget Area
//make this directory pointer dynamic based on which folder under widgets we are currently working on
DEFINE ('WIDGET', ABSPATH.'/wp-content/plugins/myplugin/widgets/inside-header-area/');
$directory_widgets = new DirectoryIterator(WIDGET); 
foreach ($directory_widgets as $files_widgets) {
    if ($files_widgets->isFile()) {
        $file_name_widget = $files_widgets->getFilename();
        $widget_text = file_get_contents(WIDGETS. $file_name_widget);
        $sidebar_id = 'inside-header-widget'; //make this dynamic based on the current foldername in the loop
        $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
        $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
        update_option('widget_text', $widget_ops);  
        update_option('sidebars_widgets', $sidebars_widgets);
    }
}

用查尔斯回答更新代码:

$base = dirname(__FILE__).'/widgets/';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) 
    {
     if ($files_widgets->isFile()) 
         {
            $file_name_widget = $files_widgets->getFilename();
            $widget_text = file_get_contents($base . [current directory?] .$file_name_widget);
//NOT SURE IF THIS IS IT OR NOT. I NEED THE CURRENT PARENT DIRECTORY'S NAME
            $sidebar_id = $files_widgets->getBasename(); //make this dynamic based on the current foldername in the loop
            $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
            $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
            update_option('widget_text', $widget_ops);  
            update_option('sidebars_widgets', $sidebars_widgets);
        }
    }
4

1 回答 1

1

我如何将其转换为对“小部件”文件夹内的任何文件夹执行的单个例程?

好吧,您已经在使用DirectoryIterator,因此您可以考虑使用RecursiveDirectoryIterator。它可用于迭代给定父目录及其包含的所有子目录中的每个文件系统对象。

$base = '/path/to/whatever';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) {
// Your same foreach contents go here.
}

停止使用常量来支持变量。我$base在示例中使用过。


如果我只希望 $base 文件夹有一代子文件夹(不再嵌套文件夹),我还需要 RecursiveDirectoryIterator 吗?

需要吗?不,但您仍然可以使用它。例如,如果您只想处理第一级,那么您可以在迭代器级别设置递归的深度:

$rdi = new RecursiveDirectoryIterator($base);
$rii = new RecursiveIteratorIterator($rdi);
$rii->setMaxDepth(1); // Or 2?  I dunno, actually.
foreach($rii as $files_widgets) {
// Your same foreach contents go here.
}

在循环遍历其文件时,如何获取对当前文件夹名称的引用?

在循环中,$files_widgets是一个SplFileInfo,因此您应该能够通过检查getPathname()getRealPath()根据您的需要来获取文件所在的目录。

于 2011-03-21T22:12:52.657 回答