Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Here is the code on how to delete all dashboard widgets - the default, and plugin widgets but I want to change the code to only delete custom dashboard widgets not the default ones.


// Create the function to use in the action hook
function remove_dashboard_widgets() {
    global $wp_meta_boxes;
    if ( !array( $wp_meta_boxes ) ) return;
    foreach ( $wp_meta_boxes as $widget_section => $widget_locations ) {
        if ( $widget_section == 'dashboard' ) {
            foreach ( $widget_locations as $widget_location => $widget_types ) {
                foreach ( $widget_types as $widget_type => $widgets ) {
                    foreach ( $widgets as $widget_name => $widget ) {
                        remove_meta_box( $widget_name, $widget_section, $widget_location );
                    }               
                }
            }
        }
    }
} 
// Hook into the 'wp_dashboard_setup' action to register our function
add_action('wp_dashboard_setup', 'remove_dashboard_widgets', 11 );
share|improve this question
add comment

2 Answers

up vote 3 down vote accepted

The built-in dashboard widgets are not marked somehow, you have to use a fixed list:

'dashboard_right_now',
'dashboard_plugins',
'dashboard_quick_press',
'dashboard_recent_drafts',
'dashboard_recent_comments',
'dashboard_incoming_links',
'dashboard_primary',
'dashboard_secondary'

So your code should test if the current widget is in that list and remove the widget, if it isn’t:

add_action(
    'wp_dashboard_setup',
    't5_remove_custom_dashboard_widgets',
    11
);

function t5_remove_custom_dashboard_widgets()
{
    global $wp_meta_boxes;

    $builtin = array (
        'dashboard_right_now',
        'dashboard_plugins',
        'dashboard_quick_press',
        'dashboard_recent_drafts',
        'dashboard_recent_comments',
        'dashboard_incoming_links',
        'dashboard_primary',
        'dashboard_secondary'
    );

    if ( empty ( $wp_meta_boxes['dashboard'] ) )
        return;

    $widget_groups = $wp_meta_boxes['dashboard'];

    foreach ( $widget_groups as $section => $widget_group )
        foreach ( $widget_group as $widgets )
            foreach ( $widgets as $id => $widget )
                if ( ! in_array( $id, $builtin ) )
                    remove_meta_box( $id, 'dashboard', $section );
}
share|improve this answer
    
I forgot to ask does this work with mu? –  Jessica May 11 '13 at 16:14
add comment

WordPress registers its widgets with the dashboard_ prefix so you could check for that prefix before removing a widget.

// Create the function to use in the action hook
function remove_dashboard_widgets() {
  global $wp_meta_boxes;
    if ( !array( $wp_meta_boxes ) ) return;
      foreach ( $wp_meta_boxes as $widget_section => $widget_locations ) {
        if ( $widget_section == 'dashboard' ) {
           foreach ( $widget_locations as $widget_location => $widget_types ) {
               foreach ( $widget_types as $widget_type => $widgets ) {
                 foreach ( $widgets as $widget_name => $widget ) {
                    preg_match('/^dashboard_/',$widget_name,$matches);
                    if ('dashboard_' !== $matches[0]) {
                       remove_meta_box( $widget_name, $widget_section, $widget_location );
                    }
                  }               
               }
           }
        }
    }
} 
// Hook into the 'wp_dashboard_setup' action to register our function
add_action('wp_dashboard_setup', 'remove_dashboard_widgets', 11 );

Of course, there is nothing to prevent some plugin or a theme from registering a widget with the same prefix.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.