Помощь в увеличении индекса объекта в цикле for (это только запись последнего объекта в папке) - PullRequest
0 голосов
/ 23 марта 2011

Сценарий, приведенный ниже, предназначен для сканирования папки «widgets» на предмет ее подпапок и файлов .txt, которые они содержат. Каждая подпапка является прокси для одного из зарегистрированных «виджетов боковой панели» моей темы, а файлы .txt в каждой папке являются «текстовыми виджетами», которые будут вставлены в зарегистрированную боковую панель, представленную ее родительской папкой.

Скрипт работает нормально, чтобы поместить отдельный текстовый виджет в каждую зарегистрированную боковую панель. Однако если в папке содержится несколько текстовых файлов, она не увеличивает значение widget_id по мере необходимости, и единственный текстовый виджет, который записывается на боковую панель, является последним в папке.

Как в этом случае настроить правильный счетчик для widget_id?

/*Install Widgets from .txt files in child folders of "/widgets/"
-------------------------------------*/

$sidebars_widgets = get_option('sidebars_widgets');
$widget_ops = get_option('widget_text');
$widget_id = count($widget_ops)+1;


$base = dirname(__FILE__).'/widgets/';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) 
    {
     if ($files_widgets->isFile()) 
         {
            $file_name_widget = $files_widgets->getPathname();
            $sidebar_id = basename($files_widgets->getPath());
            $widget_text = file_get_contents($file_name_widget);
            $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
  //Do I need another loop here?
  //Only the last widget in the folder is created
            $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);
            $widget_id = $widget_id +1;
        }
    }

Справочная информация: Папка «widgets» содержит 5 папок, каждая из которых представляет зарегистрированную боковую панель, которую создает моя тема, и названа для идентификатора этой боковой панели.

Например, эта боковая панель зарегистрирована в functions.php

register_sidebar(array(
    'name' => 'Home Sidebar',
    'id' => 'home-sidebar-widget',
    'before_widget' => '<div class="menu side %2$s sb">',
    'after_widget' => '</div>',
    'before_title' => '<h4 class="sidebarTitle">',
    'after_title' => '</h4>',
));

И соответствующая папка, которая содержит все виджеты, которые будут предварительно заполнять этот виджет ...

widgets/home-sidebar-widget/

И он содержит 3 файла .txt, каждый из которых представляет текстовый виджет, который должен быть добавлен на эту боковую панель.

Проблема в том, что мой счетчик для widget_id, по-видимому, неверен, и я получаю только последний файл .txt в каждой папке, записанный на боковую панель.

1 Ответ

1 голос
/ 23 марта 2011

Вы можете попробовать что-то подобное, предполагая, что массивы сериализуются перед сохранением в базе данных и затем не сериализуются при получении.

Попробуйте что-нибудь подобное

/*Install Widgets from .txt files in child folders of "/widgets/"
-------------------------------------*/

// Remove the line below as we will fetch the value in the loop
//$sidebars_widgets = get_option('sidebars_widgets');

$widget_ops = get_option('widget_text', array());
$widget_id = count($widget_ops) + 1;

$base = dirname(__FILE__).'/widgets/';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) 
{
     if ($files_widgets->isFile()) 
     {
            $file_name_widget = $files_widgets->getPathname();
            $sidebar_id = basename($files_widgets->getPath());
            $widget_text = file_get_contents($file_name_widget);

            // Retrieve the last value of the 'sidebars_widgets' option
            $sidebars_widgets = get_option('sidebars_widgets', array());

            // Add the current widget to the sidebar
            $sidebars_widgets[$sidebar_id][] = "text-".$widget_id;

            // Retrieve the last value of the 'widget_text' option
            $widget_ops = get_option('widget_text', array());

            // Add the new widget to the list of widgets
            $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);

            // Update the options with the updated arrays
            update_option('widget_text', $widget_ops);  
            update_option('sidebars_widgets', $sidebars_widgets);
            $widget_id = $widget_id + 1;
     }
}

EDIT
- Заменено array_merge() оператором +

...