方法
所以我已经研究过了,我的方法是:
启动自定义程序时,检查所有侧栏,并在发现小部件的任何用法后立即禁用它,每当侧栏发生更改时,请再次执行此操作免责声明有以下限制:
这是我第一次尝试使用定制器的JS API。因此,我可能在这里做一些效率低下的事情,但嘿,这很有效;)
只关心定制程序(如问题中所述)不进行任何类型的服务器端验证。它只是隐藏UI,因此如果您担心有人绕过UI,这是不完整/不安全的禁用小部件是全局的-任何侧栏中的任何使用都会全局禁用小部件
代码现在我们已经完成了免责声明,让我们看看代码:
(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
添加脚本的操作。您可以扩展它,将其限制为每个边栏基础,而不是全局基础。我要说的是,听一下侧边栏的激活,然后数一数侧边栏中的小部件。但我也没有时间去调查。