Je suis dans une quête nocturne pour construire un widget personnalisé à usage unique .
Dès qu'une instance de celle-ci a été ajoutée à un panneau de la barre latérale dans le Customizer , son contrôle sur le panneau des widgets disponibles doit être affiché comme étant désactivé (ou, sinon, disparaître entièrement).
Voici à quoi cela ressemblerait (notez le widget visuellement "désactivé" sur la droite):
Le widget personnalisé est enregistré et tout, mais je suis bloqué à l'exigence d'utilisation unique.
widget-added
, widget-updated
et widget-synced
, mais manque un événement pour le "widget supprimé".Merci beaucoup d'avance!
Mise à jour: Je n’ai pas encore mis ma preuve de concept sur une prise en pension publique.
J'ai présenté la solution gentiment partagée par kraftner ci-dessous dans un plug-in preuve de concept sur GitHub .
J'ai donc examiné cela et mon approche est la suivante:
Cela a les limitations suivantes:
Maintenant que le Disclaimer est terminé, regardons le code:
(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 );
Note: Utilisez l'action customize_controls_enqueue_scripts
pour ajouter le script.
Vous pourriez probablement étendre ceci pour le limiter à une base de travail par barre latérale plutôt que globale. Je dirais qu'il faut écouter l'activation d'une barre latérale, puis compter les widgets dans cette barre latérale. Mais je n'ai pas trouvé le temps de regarder cela aussi.