我想打破三个容器上的侧边栏。每个容器应最多容纳侧栏的三个小部件。因此,我需要分别为小部件0到2、3到5和6到8查找HTML。
通常,我会使用dynamic_sidebar()
显示侧栏,但此函数不接受参数来指定我只需要侧栏的一系列小部件。而且,我发现wp_get_sidebars_widgets()
, 但它并不打算用于主题。
如何仅获取动态侧栏给定范围内的小部件?例如,这就是我的想法。
// functions.php
// display range of widgets of a sidebar
function dynamic_sidebar_range($name, $from, $to)
{
$widgets = get_dynamic_sidebar($name); // this function doesn\'t exist!
for ($i = $from; $i < count($widgets) && $i < $to; ++$i ) {
$widget = $widgets[$i];
echo $widget[\'before_widget\']
. $widget[\'before_title\']
. $widget[\'title\']
. $widget[\'after_title\']
. $widget[\'content\']
. $widget[\'after_widget\'];
}
}
// frontpage.php
// consists of blocks of three posts or widgets alternatingly
for ($sections = 0; $sections < 3; ++$sections) {
// display three posts
for ($i = 0; $i < 3 && have_posts(); ++$i) {
the_post();
// ...
}
// display three widgets
$from = $sections * 3;
$to = $from + 3;
dynamic_sidebar_range(\'name\', $from, $to);
}
SO网友:s_ha_dum
如果您想要的是“在三个容器上分解一个侧栏”,那么您实际上不需要重建dynamic_sidebar()
去做吧。有一个名为dynamic_sidebar_params
这可以用来打破侧边栏。
function add_closing($params) {
$params[0][\'after_widget\'] = $params[0][\'after_widget\'].\'</div><!-- close wrapper-thing -->\';
return $params;
}
add_filter(
\'dynamic_sidebar_params\',
function ($params) {
static $c = 0;
if (0 === $c || 0 === $c%3) {
$params[0][\'before_widget\'] = \'<div class="wrapper-thing" style="border:1px solid white;float:left">\'.$params[0][\'before_widget\'];
remove_filter(\'dynamic_sidebar_params\',\'add_closing\');
} else {
add_filter(\'dynamic_sidebar_params\',\'add_closing\');
}
$c++;
return $params;
}
);
我觉得这有点“代码高尔夫”的意思。我相当确信,正如评论中所建议的那样,三个不同的侧边栏是一种更好的方法。
这将把小部件包装在不同容器中的侧栏中,每个容器三个。如果您想要不同的小部件区域,那么您所做的完全是错误的。这将比单独的侧边栏更令人困惑,它将从最终用户那里删除控制。更不用说,您将需要在很大程度上重新创建核心代码。
只需按预期使用边栏系统。