WordPress is being used more and more as a content management system. Its flexibility and customisability combined with its wide support base and easy-to-develop-on API makes it a fantastic choice for developers. However, some options aren’t available right in the admin interface, and whilst what you want to do is probably possible, it often requires a bit of rooting around.
If you want to use WordPress as a CMS for a client, one of the main things you want to do is strip out all of the things you don’t need, and prevent the client from accessing anything that might allow them to do crazy things to their installation. A lot of this can be controlled by defining the correct user role for their account, or using a plugin like User Access Manager. Other things are a little more difficult to get rid of.
Widgets, for example, are a great way to enable users to add little boxes of content to their themes. Because of the way they are handled, there is little chance that giving your clients access to the widgets section of the dashboard will enable them to wreck havoc on the template. However, that doesn’t mean you want to allow them to throw what ever they can on there. After all, your client doesn’t necessarily know what a tag cloud or an RSS feed is, and those widgets could easily be irrelevant to the website’s purpose.
After a bit of hunting around, and a helpful pointer on the WordPress support forum, I have found a way of disabling each of the default WordPress widgets, one-by-one. Simply place the following code in your themes functions.php file, enclosed in PHP tags:
add_action( 'widgets_init', 'my_unregister_widgets' );
function my_unregister_widgets() {
unregister_widget( 'WP_Widget_Pages' );
unregister_widget( 'WP_Widget_Calendar' );
unregister_widget( 'WP_Widget_Archives' );
unregister_widget( 'WP_Widget_Links' );
unregister_widget( 'WP_Widget_Categories' );
unregister_widget( 'WP_Widget_Recent_Posts' );
unregister_widget( 'WP_Widget_Search' );
unregister_widget( 'WP_Widget_Tag_Cloud' );
unregister_widget( 'WP_Widget_Meta' );
unregister_widget( 'WP_Widget_Recent_Comments' );
unregister_widget( 'WP_Widget_RSS' );
unregister_widget( 'WP_Widget_Text' );
}
As far as I am aware, due to the changes to widgets in WordPress 2.8, this will only work in 2.8 – but I’m sure there are methods for earlier versions if you are prolonging an update. This will unregister each of the default widgets.
If there are any widgets in that list that you don’t wish to disable, you can either comment out or remove the particular line that refers to the widget you wish to use.
This brings me one step closer to having a completely clean installation of WordPress that I can use as a CMS for all clients.

Thanks for this.
Needed to do this on a client job – big help.