程序化添加Widget:如何避免冲突?

时间:2015-07-03 作者:PaulJ

我正在开发一个主题,并试图通过编程将小部件添加到其侧栏中。我读到了这个极好的答案:

https://wordpress.stackexchange.com/a/51086/14225

但有一件事我不清楚:你从哪里得到附加到小部件的数字?(search-2, archives-3, 等等)。例如,新安装的WP上的默认窗口小部件初始化如下:

update_option( \'sidebars_widgets\', array ( \'wp_inactive_widgets\' => array (), \'sidebar-1\' => array ( 0 => \'search-2\', 1 => \'recent-posts-2\', 2 => \'recent-comments-2\', 3 => \'archives-2\', 4 => \'categories-2\', 5 => \'meta-2\', ), \'array_version\' => 3 ) );
为什么search-2 而不是search-1, 例如OTOH,上面的链接答案只使用了$counter 变量为侧栏中的每个小部件提供不同的数字,从1开始。

我意识到所有这些都是为了避免同一小部件的不同实例之间发生冲突。我不明白的是,应该在哪个级别上避免它们:在同一侧边栏中的不同小部件之间?同一个小部件的不同实例,添加到不同的主题?同一个小部件的不同实例在同一主题中,但在不同的侧栏中?生成数字以避免冲突时的最佳做法是什么?

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

查看WordPress用于注册小部件的源代码here, 第242行定义了一个$number参数,如下所示:

与同一类的其他实例相比,此小部件实例的唯一订单号。

功能_set($number) 存储附加到小部件基本标识符字符串的ID号。

然后,函数get_settings 在所有侧栏中检索小部件的所有实例的所有配置选项。当他们注册的时候$number 生成完整小部件ID的一部分:

 public function _register() {
                $settings = $this->get_settings();
                $empty = true;

                if ( is_array($settings) ) {
                        foreach ( array_keys($settings) as $number ) {
                                if ( is_numeric($number) ) {
                                        $this->_set($number);
                                        $this->_register_one($number);
                                        $empty = false;
                                }
                        }
                }
[...]
register_one 函数,我们发现:

整数$数字可选。与同一类的其他实例相比,此小部件实例的唯一订单号。

那么,ID的组合$number 使用$id_base 在任何侧栏中,您的小部件的所有实例的名称都必须是唯一的。

结束

相关推荐

customize footer widgets area

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