【发布时间】: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_text和sidebars_widgets选项只有一个唯一条目。如果我错了,请告诉我 -
在下面查看我的答案,让我知道这是否适合您
-
@sly:谢谢!现在检查一下。