Сценарий, приведенный ниже, предназначен для получения каждой папки, определенной как «WIDGET», и перебора ее файлов, загрузки их содержимого в базу данных в качестве объекта виджета.
Это работает нормально, однако, как вы можете видеть ниже, для каждой папки внутри папки виджетов, для которой я хочу выполнить эту подпрограмму, мне нужно создать отдельную ветвь почти идентичного кода, заполнив оператор DEFINE командой жестко заданный путь к папке, содержащей содержимое виджета для этого объекта виджета. Например, имя_фолдера (WIDGET) и $ sidebar_id для этого объекта виджета (которые совпадают).
Поскольку я называю свои папки в каталоге «widgets», так же, как и мои зарегистрированные «виджеты» в базе данных, я хотел бы преобразовать эту процедуру в динамическую, которая зацикливается на каталогах внутри «widgets» "папка и для каждой найденной папки выполняет код, начинающийся с оператора DEFINE.
Как бы я преобразовал это в одну подпрограмму, которая выполняется для любой папки внутри папки "widgets"?
//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);
}
}