web-dev-qa-db-fra.com

Obtenez une liste de tous les widgets enregistrés dans la zone de widgets admin de WordPress

J'essaie de désactiver quelques widgets standard dans mon thème functions.php. J'ai donc écrit cette petite fonction qui fonctionne bien:

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);

Maintenant, je veux désactiver d'autres widgets, qui peuvent être installés/activés par d'autres plugins. Mais je ne sais pas comment obtenir une liste de tous les noms de classes de widgets enregistrés, je peux donc les désenregistrer avec unregister_widget()?

5
Tobias

Les widgets sont stockés dans une variable publique $widgets dans la classe WP_Widget_Factory. Vous pouvez accéder à cette classe par la variable globale $wp_widget_factory.

Pour obtenir tous les widgets enregistrés, listez les clés:

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>';
});

Pour supprimer tous les widgets, annulez l'inscription de chaque widget séparément avec unregister_widget() (préféré) ou videz le tableau en une fois:

add_action( 'widgets_init', function()
{
    if ( empty ( $GLOBALS['wp_widget_factory'] ) )
        return;

    $GLOBALS['wp_widget_factory']->widgets = array();
}, 20);
10
fuxia