在_Widget_Form中检测边栏ID

时间:2017-05-06 作者:Christina

我已经广泛地查找了这个问题,但找不到php的答案,只有js或css。

在我的widget类中dynamic_sidebar_params 我只在该实例上输出css类:

if ( \'sidebar\' === $params[0][ \'id\' ] || \'after-entry\' === $params[0][ \'id\' ] ) :

   // Add the classes added in the Widget Style Field
    if ( ! empty( $instance[ \'prefix_select_class\' ] ) ) :

         $class = $instance[ \'prefix_select_class\' ];

         $params[0][\'before_widget\'] = preg_replace(\'/class="/\', \'class="\'. $class . \' \',  $params[0][\'before_widget\'], 1 );

     endif; // cherish_select_class not empty

endif; //specific widgets
但是在in_widget_form 我无法获取$参数,不知道如何获取,是否有方法不显示基于侧边栏id的特定字段?

1 个回复
最合适的回答,由SO网友:birgire 整理而成

侧栏和小部件之间的关系存储在sidebars_widgets 选项,作为一个序列化数组,可能如下所示(展开):

Array
(
    [orphaned_widgets_1] => Array
        (
            [0] => recent-posts-2
        )

    [wp_inactive_widgets] => Array
        (
            [0] => calendar-2
        )

    [sidebar-1] => Array
        (
            [0] => recent-posts-5
            [1] => text-6
            [2] => text-2
            [3] => search-6
            [4] => text-3
        )

    [sidebar-2] => Array
        (
            [0] => text-4
        )

    [sidebar-3] => Array
        (
            [0] => text-5
            [1] => recent-posts-6
            [2] => search-7
        )

)
WordPress使用wp_get_sidebars_widgets() 函数获取此关系。

如果我们想在哪个侧栏中找到,例如最近帖子的第五个实例小部件(recent-posts-5 ) 属于,然后我们可以搜索数组并找到sidebar-1 侧栏。

Helper function:

我们可以使用这样的辅助函数来实现这一点:

/**
 * @param string       $widget_id  Widget ID e.g. \'recent-posts-5\'
 * @return string|null $sidebar_id Sidebar ID e.g. \'sidebar-1\'
 */
function wpse_get_sidebar_id_from_widget_id( $widget_id )
{
    $sidebars = wp_get_sidebars_widgets();
    foreach( (array) $sidebars as $sidebar_id => $sidebar )
    {
        if( in_array( $widget_id, (array) $sidebar, true ) )
            return $sidebar_id;
    }
    return null; // not found case
}
在中PHP 7.1 我们可以使用?string 作为可为null的字符串类型。

Usage example:

$sidebar_id = wpse_get_sidebar_id_from_widget_id( \'recent-post-5\' );
所以在你的in_widget_form 您可以尝试的回调(未测试):

add_action( \'in_widget_form\', function( $widget_object, $return, $instance )
{
    $sidebar_id = wpse_get_sidebar_id_from_widget_id( $widget_object->id );

    if( is_string( $sidebar_id ) )
    {
        // ... do stuff ...
    }

}, 10, 3 );
Update:

这似乎在这里得到了类似的解决:How to determine which sidebar the widget has been added to, via widget admin?.

结束

相关推荐

customize footer widgets area

我有一个自定义的页脚小部件区域,它在一行中水平显示最多4个小部件。如果我添加了4个以上的小部件,那么布局就会中断,因为我试图在同一行中显示它。我想让它更灵活,例如有2行(div),我可以在第一行中添加let’s 2 widget,在第二行中添加4个widget。可能我需要的是复制这一个,并制作两个页脚区域。这可能吗?如果可能,我如何实现?下面是我的小部件的实际代码。php: /* Footer Widgets */ $footer_widgets_num = wp_get_sidebars_