【问题标题】:Help with incrementing an object index in for loop (its only writing the last object in the folder)帮助增加 for 循环中的对象索引(它只写文件夹中的最后一个对象)
【发布时间】:2011-03-23 03:48:41
【问题描述】:

下面的脚本旨在扫描名为“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 个文件夹,每个文件夹代表一个已注册的边栏,我的主题创建并以该边栏的 id 命名。

比如这个侧边栏注册在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 文件写入侧边栏。

【问题讨论】:

  • 您的代码看起来不错,但我不知道update_option() 函数的作用
  • 它是 WordPress 的内置功能。它只是更新 widget_text 的值并将 $widget_ops 中的数组传递给数据库。该代码工作正常,它只是覆盖文件夹中的每个文件,直到它到达最后一个。那是唯一一个写入数据库的。这让我觉得我错过了一个计数器或者我需要另一个循环。
  • 那么在这种情况下,我猜update_option() 将使用您传递的值更新数据库中名为widget_text 的选项。因此,在每次迭代中,相同的选项都会被下一次更新和覆盖。因此只有最后一个保存在数据库中。我想widget_textsidebars_widgets 选项只有一个唯一条目。如果我错了,请告诉我
  • 在下面查看我的答案,让我知道这是否适合您
  • @sly:谢谢!现在检查一下。

标签: php for-loop counter


【解决方案1】:

您可以尝试类似的方法,假设数组在保存到数据库之前被序列化,然后在检索时被取消序列化。

试试类似的方法

/*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;
     }
}

编辑
- 将 array_merge() 替换为 + 运算符

【讨论】:

  • @Sly,我尝试了两种方式:直接(按原样)和您的 [$sidebar_id][] 建议。后者抛出错误(strip_tags() 期望参数 1 为字符串...)...继续...
  • ...原样版本没有错误,但也无法正常工作。它的正确之处在于它确实将位于其中一个文件夹中的所有小部件放入小部件中。但是,它将它们写入错误的侧边栏。它将一个小部件放入每个侧边栏中,但它们都应该在同一个侧边栏中(因为它们位于同一个文件夹中)。
  • @Scott 是的,我明白了。尝试将$sidebars_widgets[$sidebar_id][] = array("text-".$widget_id); 替换为$sidebars_widgets[$sidebar_id][] = "text-".$widget_id;。我已经相应地更新了我的答案代码。让我知道这是否有效。
  • @Sly:我认为我们有赢家!做得好。超越。 +1,如果我能 +100,我会的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2021-08-31
  • 2017-03-31
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多