Obtener una lista de todos los Widgets registrados en el área de widgets de WordPress
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()
.

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

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

@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
.
