方法
所以我研究了这个,我的方法是这样的:
- 启动定制程序时,请遍历所有侧边栏,并在发现有任何用法后立即禁用它
- 每当边栏更改时,请再次执行此操作。
免责声明
这具有以下限制:
- 这是我第一次涉足Customizer的JS API。所以我可能在这里做效率低下的事情,但是,嘿,它有用;)
- 只关心定制器(如问题所述)
- 不执行任何类型的服务器端验证。它只是隐藏用户界面,因此,如果您担心有人绕过用户界面,这是不完整/不安全的。
- 禁用小部件是全局的-在任何侧边栏中的任何使用都会全局禁用小部件。
编码
现在我们已经完成了Disclaimer,让我们看一下代码:
(function() {
wp.customize.bind( 'ready', function() {
var api = wp.customize,
widgetId = 'foo_widget',
widget = wp.customize.Widgets.availableWidgets.findWhere( { id_base: widgetId } );
/**
* Counts how often a widget is used based on an array of Widget IDs.
*
* @param widgetIds
* @returns {number}
*/
var countWidgetUses = function( widgetIds ){
var widgetUsedCount = 0;
widgetIds.forEach(function(id){
if( id.indexOf( widgetId ) == 0 ){
widgetUsedCount++;
}
});
return widgetUsedCount;
};
var isSidebar = function( setting ) {
return (
0 === setting.id.indexOf( 'sidebars_widgets[' )
&&
setting.id !== 'sidebars_widgets[wp_inactive_widgets]'
);
};
var updateState = function(){
//Enable by default...
widget.set('is_disabled', false );
api.each( function( setting ) {
if ( isSidebar( setting ) ) {
//...and disable as soon as we encounter any usage of the widget.
if( countWidgetUses( setting.get() ) > 0 ) widget.set('is_disabled', true );
}
} );
};
/**
* Listen to changes to any sidebar.
*/
api.each( function( setting ) {
if ( isSidebar( setting ) ) {
setting.bind( updateState );
}
} );
updateState();
});
})( jQuery );
旁注:使用customize_controls_enqueue_scripts
操作添加脚本。
您可能会扩展它以限制它在每个侧边栏基础而不是全局基础上工作。我会说听侧边栏的激活,然后计算该侧边栏中的小部件。但是我也没有时间去研究它。
WP_Widget
,例如:gist.github.com/westonruter/7141599