Ottenere un elenco di tutti i Widget registrati nell'area widget di WordPress admin
Sto cercando di disabilitare alcuni widget standard nel mio tema functions.php
.
Ho scritto questa piccola funzione, che funziona bene:
function my_widget_ctrl() {
unregister_widget('WP_Widget_Pages');
unregister_widget('WP_Widget_Calendar');
unregister_widget('WP_Widget_Archives');
unregister_widget('WP_Widget_Links');
unregister_widget('WP_Widget_Meta');
unregister_widget('WP_Widget_Text');
unregister_widget('WP_Widget_Recent_Posts');
unregister_widget('WP_Widget_Recent_Comments');
unregister_widget('WP_Widget_RSS');
unregister_widget('WP_Widget_Tag_Cloud');
}
add_action('widgets_init', 'my_widget_ctrl', 11);
Ora voglio disabilitare alcuni altri Widget, che potrebbero essere installati/attivati da altri Plugin. Ma non so come ottenere un elenco di tutti i nomi delle classi dei widget registrati, in modo da poterli deregistrare con unregister_widget()
?

I widget sono memorizzati in una variabile pubblica $widgets
all'interno della classe WP_Widget_Factory
. Puoi accedere a questa classe tramite la variabile globale $wp_widget_factory
.
Per ottenere tutti i widget registrati, elenca le chiavi:
add_action( 'wp_footer', function()
{
if ( empty ( $GLOBALS['wp_widget_factory'] ) )
return;
$widgets = array_keys( $GLOBALS['wp_widget_factory']->widgets );
print '<pre>$widgets = ' . esc_html( var_export( $widgets, TRUE ) ) . '</pre>';
});
Per rimuovere tutti i widget, puoi deregistrare ogni widget singolarmente con unregister_widget()
(opzione preferita) oppure svuotare l'array in un'unica operazione:
add_action( 'widgets_init', function()
{
if ( empty ( $GLOBALS['wp_widget_factory'] ) )
return;
$GLOBALS['wp_widget_factory']->widgets = array();
}, 20);

Tuttavia, questo restituisce i widget dai plugin, ma non sembra restituire alcun widget personalizzato registrato

@DerkJanSpeelman probabilmente perché vengono registrati più tardi, ma si spera durante la stessa azione widget_init
. Prova a cambiare la priorità da 20 a 100 o anche 1000 e vedi cosa ottieni. I plugin/temi/codici ben scritti dovrebbero sempre registrare i widget durante widget_init
.
