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
Derk Jan Speelman
@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