私は毎晩、{カスタムの使い捨てウィジェットを作成しようとしています。
その1つのインスタンスがサイドバーパネルカスタマイザ内に追加されるとすぐに、Available Widgetsパネル上のそのコントロールは無効として表示される(または完全に消える)になります。
これはどのように見えるかです(右側の視覚的に「無効にされた」ウィジェットに注意してください)
カスタムウィジェットは登録済みですべてですが、私は使い捨ての要件にこだわっています。
widget-added
、widget-updated
、およびwidget-synced
に悩まされていますが、「widget deleted」のイベントを見逃しています。事前にありがとうトン!
最新情報:私の概念実証をまだ公共の場で行っているわけではないが、もちろんそうするだろう。
以下のkraftnerの親切な解決策をGitHubの proof of conceptプラグインで包みました 。
それで、私はこれを調べました、そして、私のアプローチはこれです:
これには以下の制限があります。
これで免責事項が終わりましたので、コードを見てみましょう。
(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
アクションを使ってスクリプトを追加してください。
これを拡張して、グローバルではなくサイドバーごとのベースで動作するように制限することができます。サイドバーのアクティブ化を聞いてから、そのサイドバーのウィジェットを数えます。しかし、私もそれを調べる時間がありませんでした。