Obtener una lista de todos los Widgets registrados en el área de widgets de WordPress

13 oct 2013, 12:34:17
Vistas: 13.9K
Votos: 7

Estoy intentando desactivar algunos widgets estándar en mi tema functions.php. Por eso escribí esta pequeña función, que funciona 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);

Ahora quiero desactivar otros widgets que puedan estar instalados/activados por otros plugins. Pero no sé cómo obtener una lista de todos los nombres de clases de widgets registrados, para poder desregistrarlos con unregister_widget().

0
Todas las respuestas a la pregunta 1
3
16

Los widgets se almacenan en una variable pública $widgets dentro de la clase WP_Widget_Factory. Puedes acceder a esta clase mediante la variable global $wp_widget_factory.

Para obtener todos los widgets registrados, lista las claves:

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

Para eliminar todos los widgets, puedes desregistrar cada widget individualmente con unregister_widget() (recomendado) o vaciar el array de una vez:

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

    $GLOBALS['wp_widget_factory']->widgets = array();
}, 20);
13 oct 2013 14:13:52
Comentarios

Sin embargo, aunque esto devuelve widgets de plugins, parece que no devuelve ningún widget personalizado registrado

Derk Jan Speelman Derk Jan Speelman
15 jun 2017 15:46:07

@DerkJanSpeelman probablemente esto se debe a que se registran más tarde, pero idealmente durante la misma acción widget_init. Intenta cambiar la prioridad de 20 a 100 o incluso 1000 y observa lo que obtienes. Los buenos plugins/temas/código siempre deberían registrar sus widgets durante widget_init.

Anastis Anastis
25 ene 2018 16:38:19

Esto devuelve todos los widgets, incluso de temas desactivados. ¿Hay alguna forma de devolver solo los widgets disponibles del tema actualmente activo? Por favor ayuda

karlosuccess karlosuccess
2 jul 2023 09:43:47