How to : Make a control panel for your wordpress theme
Posted by X-OR on Jul 5, 2008 in Blogging, Blogging tips, GNU/Linux, Mac, featured, wordpress • 14 commentsMimbo is one of the most used magazine theme for wordpress, it’s a great theme ! The only weakness is the way you change its options … Manually in the code …
It’s why i decided to create my own custom mimbo theme which includes a control panel. In this post I’m going to show you how you can create a control panel for your theme (in this example I will use mimbo).
What will the control panel look like.

In this picture you can see the options included in my theme (theme i use for my blog http://www.x-or.be).
1° Creating the file functions.php
Look into your theme directory for the file functions.php, if it doesn’t exist create it so we can begin our work.
2° Creating the initialization function
function mimic_init() { // add_option('variable name','default value' // Category to show in the top menu // add_option('mimic_menu_cat', '1,2,3'); // Featured category// add_option('mimic_featured_cat', 0); }
This function initiliazes all variables in case they have no value (first run of the control panel)
3° Creating the function which gets/saves the data
Where variables are set with saved data and where the data is saved …
function mimic_add_theme_page() { // if variables are empty we call the function mimic_init to set the default values if((get_option('mimic_featured_cat') == '')||(get_option('mimic_menu_cat') == '')) {mimic_init();} if ($_GET['page'] == basename(__FILE__)) { //if the form was submited we saved the changes if ( 'save' == $_REQUEST['action'] ) { //----- if(isset($_REQUEST['mimic_featured_cat'])) {update_option('mimic_featured_cat', $_REQUEST['mimic_featured_cat']);} else {update_option('mimic_featured_cat', 'Fill this field please');} if(isset($_REQUEST['mimic_menu_cat'])) {update_option('mimic_menu_cat', $_REQUEST['mimic_menu_cat']);} else {update_option('mimic_menu_cat', 'Fill this field please');} header("Location: themes.php?page=functions.php&saved=true");die; } // Addd the header (css + script) to the control panel add_action('admin_head', 'mimic_theme_page_head');} //add_menu_page(page_title, menu_title, access_level/capability,file,[function]); add_theme_page('Mimbo-Custom Options', 'Mimbo Custom Options', 'edit_themes', basename(__FILE__), 'mimic_theme_page'); }
4° Creating the form and the header
Were we design the form …
Code for the Form
function mimic_theme_page() { if ( $_REQUEST['saved'] ) echo ‘<div id=”message” class=”updated fade”><p><strong>Options Saved</strong></p></div>’; ?> <div class=“wrap”> <div id=“mimic”> <h2>Options de Mimic</h2> <form name=“mimic” method=“post” action=“<?php $_SERVER['REQUEST_URI']; ?>”> <input type=“hidden” name=“action” value=“save” /> <table class=“optiontable”> <tbody> <tr> <th>Category IDs of the <em> navigation menu</em>:</th> <td><input name=“mimic_menu_cat” id=“mimic_menu_cat” type=“text” class=“code” value=“<?php echo get_option(’mimic_menu_cat’); ?>” /><br/></td> </tr> <tr> <th>Featured category ID :</th> <td><input name=“mimic_featured_cat” id=“mimic_featured_cat” type=“text” class=“code” value=“<?php echo get_option(’mimic_featured_cat’); ?>” /><br/></td> </tr> </tbody> </table> <p class=“submit”><input type=“submit” name=“Save” value=“Apply »” /></p> </form> </div> </div> <?php }?
This function creates the form for entering the Options values
Code for the Header
function mimic_theme_page_head() { // header Css+Script ...?> <style type="text/css"> p {margin-left:4px;} #mimic {margin:5px;padding:10px;} </style> <?php}
We have nearly finished, there is only one last thing to do, we have to get the Saved values to use it in our theme.
5° Editing your index.php file (or any other)
Where the magic happens
Just add this piece of code in index.php
<?php /* Getting options value*/ /* Getting Featured Category ID */ $fcat = get_option('mimic_featured_cat'); ?>
The following code is specific to the mimbo theme but other themes use the same function to show posts so you can adapt it to fit your theme.
In mimbo you can find this piece of code to show the last post of the featured category.
query_posts('showposts=1&cat=1');
replace it by this code
query_posts('showposts=1&cat='.$fcat);
replace also this line
wp_list_categories('include=1&title_li=&style=none'); ?>
by
wp_list_categories('include='.$fcat.'&title_li=&style=none'); ?>
and that’s all, you can now administrate your theme in the admin zone.







Thanks for this tutorial, this is great! The snippets works perfectly.
Though, in my opinion there’s not enought explanations apart from the code.
No problem,
thanks for you comment, for the next tutorial i will try to explain steps more in details
This is really great! It’s exactly what I wanted to work on this summer, but other projects have gotten in the way. I’d like to start designing Mimbo v3.0 in August - if you’re interested in collaborating on the control panel, drop me an email.
Thanks Darren, i would be honored to be part of the mimbo 3.0 project.
I’ve just sent you an e-mail
Few weeks ago I have also created tutorial about creating control panel for a theme:
http://blog.starscapetheme.com/2008/05/31/create-settings-page-for-theme/
Based on my Starscape Theme with wide range of settings for controling theme:
http://blog.starscapetheme.com/starscape/
It’s good to see more themes that have control panels for easier customization.
Jean, I want to put a control panel in my theme, I was going to start by just making this code work and then change it to suit my needs. But in part 4, there is a bit of code at the end to begin PHP - “<?php }?” that if I leave it I get an error and if I remove it I also get an error.
Also do all those pieces of code go into the functions.php file except for the bit that goes into index.php?
Hi Tim,
(it’s not Jean but Michael
)
i upload the functions.php here so you can use it as you want
all code go into functions.php (sorry but my first “how to” post was a little messy)
Tell me if everything goes well
Sorry, I mean Michael
I sent you a contact on your site with more info, I think it will be better that way, thanks!
Never mind, it worked fine. I made the mistake of having an extra line at the bottom of the functions file, once I removed them it worked!
Thanks for taking the time to make this look easy