使用小部件数组编号在侧边栏中循环小部件?

时间:2018-11-28 作者:red5

Loop through widgets in sidebar

@birgire中的这个函数对我来说几乎是完美的,但是我如何使用边栏数组作为第二个参数来调用它,而不是小部件ID。在他的示例中,我想这样做:

wpse\\u show\\u小部件(“大厅侧栏”,大厅侧栏[0]);

在birgire最初的帖子中,他得到了一个名为“侧栏-1”的注册小部件和一个ID为“calendar-2”的注册小部件。

我希望第二个参数是数组ID,而不是试图找到WordPress分配给小部件的特定ID。这比小部件ID更容易找到。

我修改了birgire的函数以使用wp\\u get\\u sidebars\\u widgets();,但《法典》表示,这是一个私人功能,不适用于主题开发。我想这里的人可能会有一个更优雅的解决方案。

1 个回复
SO网友:red5

我正在使用original post by birgire, 但我不知道使用wp\\u get\\u sidebars\\u widgets()是否“可以”;以这种方式。

function wpse_show_widget_alt( $index, $id ) {
global $wp_registered_widgets, $wp_registered_sidebars;
    $did_one = FALSE;

    //This built-in func isn\'t meant for theme or plugin development. 
    //I don\'t know any other way to list widgets in an array sorted by sidebar.
$theWidgets = wp_get_sidebars_widgets();
$widgetNumber = $theWidgets[$index][$id];

// Check if $id is a registered widget
if( ! isset( $wp_registered_widgets[$widgetNumber] ) 
    || ! isset( $wp_registered_widgets[$widgetNumber][\'params\'][0] ) ) 
{
    return FALSE;
}

// Check if $index is a registered sidebar
$sidebars_widgets = wp_get_sidebars_widgets();
if ( empty( $wp_registered_sidebars[ $index ] ) 
    || empty( $sidebars_widgets[ $index ] ) 
    || ! is_array( $sidebars_widgets[ $index ] ) )
{
    return FALSE;
}

// Construct $params
$sidebar = $wp_registered_sidebars[$index];
$params = array_merge(
                //array( array_merge( $sidebar, array(\'widget_id\' => $id, \'widget_name\' => $wp_registered_widgets[$id][\'name\']) ) ),
                array( array_merge( $sidebar, array(\'widget_id\' => $widgetNumber, \'widget_name\' => $wp_registered_widgets[$widgetNumber][\'name\']) ) ),
                (array) $wp_registered_widgets[$widgetNumber][\'params\']
          );

// Substitute HTML id and class attributes into before_widget
$classname_ = \'\';
foreach ( (array) $wp_registered_widgets[$widgetNumber][\'classname\'] as $cn )
{
    if ( is_string($cn) )
        $classname_ .= \'_\' . $cn;
    elseif ( is_object($cn) )
        $classname_ .= \'_\' . get_class($cn);
}
$classname_ = ltrim($classname_, \'_\');
$params[0][\'before_widget\'] = sprintf($params[0][\'before_widget\'], $widgetNumber, $classname_);         
$params = apply_filters( \'dynamic_sidebar_params\', $params );

// Run the callback
$callback = $wp_registered_widgets[$widgetNumber][\'callback\'];            
if ( is_callable( $callback ) )
{
     call_user_func_array( $callback, $params );
     $did_one = TRUE;
}
return $did_one;}

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst