问题描述
我想要检索侧边栏中存在的每个小工具,例如。将它们与主循环中的帖子混合。
我知道我可以使用不同的窗口小工具区域 (侧边栏),但是这种方法把几百个边栏的 widget 页面嵌在一起。为了减轻这个问题,我想把它们添加到一个侧边栏,并在需要时连续检索。
但我被困了我不知道如何单独检索一个小工具。
我的尝试是使用 wp_get_sidebars_widgets 和 the_widget,但是我无法检索窗口小工具的类名。
这是我的代码的简化片段。在这种情况下,我正在尝试每三个帖子添加一个小工具,但是对逻辑进行过度简化 (因为我不想只是为了定期添加它们) 来提供这个想法。我想使用 the_widget
或任何其他功能可视化每个窗口小工具。我该如何做到这一点?可能吗?
<?php
$i = 1;
$widgets = wp_get_sidebars_widgets(); // I KNOW THE USE OF THIS IS DISCOURAGED (PRIVATE) BUT CANNOT FIND ALTERNATIVES.
if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
if ($i%3 == 0){
echo "<h1>WIDGET #".($i/3)."</h1>";
the_widget($widgets['homepage-1'][$i/3]); // THIS DOES NOT WORKS SINCE I'M NOT GIVING THE CLASS NAME. HOW TO RETRIEVE IT?
}
get_template_part( 'content', get_post_format() );
$i++;
?>
<?php endwhile; ?>
<?php _s_paging_nav(); ?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif; ?>
最佳解决方案
我将问题的核心是:「… 我无法检索窗口小工具类名称」
您将需要检查 global
变量 $wp_registered_widgets
来填写缺少的信息。这个 proof-of-concept 代码应该给你的想法。该代码假定一个名为 sidebar-1
的侧栏。你必须调整。
global $wp_registered_widgets;
$widgets = wp_get_sidebars_widgets();
var_dump($widgets['sidebar-1']); // dump the data
foreach ($widgets['sidebar-1'] as $widget) {
var_dump($wp_registered_widgets[$widget]); // dump the data
}
为了更多的指导,看看 dynamic_sidebar
的工作原理,这基本上是我做了上面的工作。
未经测试,但这很有趣,我嘲笑了一些更完整的代码:
global $wp_registered_widgets;
$i = 1;
$widgets = wp_get_sidebars_widgets();
$widgets = $widgets['homepage-1'];
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
if ($i%3 == 0){
echo "<h1>WIDGET #".($i%3)."</h1>";
$cn = $wp_registered_widgets[$widgets[$i%3]]['callback'][0];
$cn = get_class($cn);
the_widget($cn,$widgets[$i%3]);
}
get_template_part( 'content', get_post_format() );
$i++;
}
_s_paging_nav();
} else {
get_template_part( 'content', 'none' );
}
次佳解决方案
你需要在适当的时间得到它。我建议在 wp
动作钩。
为此,我们从 widgets.php
中的 dynamic_sidebar
函数中窃取一些代码:
add_action( 'wp', 'widgets_run' );
function widgets_run() {
global $wp_registered_widgets;
$sidebars_widgets = wp_get_sidebars_widgets();
if ( empty( $sidebars_widgets ) )
return false;
foreach ( (array) $sidebars_widgets as $sidebar_id => $sidebar_widgets ) {
foreach( $sidebar_widgets as $sidebar_widget ) {
if ( ! isset( $wp_registered_widgets[ $sidebar_widget ] ) )
continue;
$classname_ = '';
foreach ( (array) $wp_registered_widgets[ $sidebar_widget ]['classname'] as $cn ) {
if ( is_string($cn) )
$classname_ .= '_' . $cn;
elseif ( is_object($cn) )
$classname_ .= '_' . get_class($cn);
}
$classnames[] = ltrim($classname_, '_');
}
}
print_r($classnames); // here you are the class names
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。