我正在开发一个主题,并试图通过编程将小部件添加到其侧栏中。我读到了这个极好的答案:
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开始。
我意识到所有这些都是为了避免同一小部件的不同实例之间发生冲突。我不明白的是,应该在哪个级别上避免它们:在同一侧边栏中的不同小部件之间?同一个小部件的不同实例,添加到不同的主题?同一个小部件的不同实例在同一主题中,但在不同的侧栏中?生成数字以避免冲突时的最佳做法是什么?
最合适的回答,由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
在任何侧栏中,您的小部件的所有实例的名称都必须是唯一的。