我想检索侧栏中存在的每个小部件,以便将它们与主循环中的帖子混合。
我知道我可以使用不同的小部件区域(侧边栏),但这种方法会使小部件管理页面中出现数十个侧边栏。为了缓解这种情况,我想只需将它们添加到一个侧栏中,并在需要时连续检索它们。
但我被卡住了。我不知道如何单独检索小部件。
我的尝试方法是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; ?>
最合适的回答,由SO网友:s_ha_dum 整理而成
我认为问题的核心是:“…我无法检索小部件类名”
您需要检查global
变量$wp_registered_widgets
填写缺失的信息。这个概念验证代码应该给您提供一些想法。代码假定有一个名为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
}
要获得更多指导,
take a look at how dynamic_sidebar
works, 这基本上就是我所做的,以解决上述问题。
未经测试,但这很有趣,我模拟了一些更完整的代码:
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\' );
}
SO网友:vmassuchetto
你需要在正确的时间得到它。我建议在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
}