从侧边栏分别检索每个小部件

时间:2014-01-05 作者:furins

我想检索侧栏中存在的每个小部件,以便将它们与主循环中的帖子混合。

我知道我可以使用不同的小部件区域(侧边栏),但这种方法会使小部件管理页面中出现数十个侧边栏。为了缓解这种情况,我想只需将它们添加到一个侧栏中,并在需要时连续检索它们。

但我被卡住了。我不知道如何单独检索小部件。

我的尝试方法是wp_get_sidebars_widgetsthe_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; ?>

2 个回复
最合适的回答,由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

}

结束

相关推荐

Custom Blog Loop on Home Page

我想看看是否可以使用循环中的args在主页上显示所有顶级帖子类别中的“最新”帖子?看见http://blog.reneerouleau.com/dev/ 例如,我当前设置的内容。我正在运行shoestrap wp。<?php wp_reset_query(); $cats = get_categories(\'\'); foreach ($cats as $cat) : if($cat->category_parent) continue