Last time I wrote about using the Theme Customizer to supplant/add to your existing options. But what if you’re writing a new theme entirely?
Do you even need an options page?
How many options does your theme have, anyway? Would it not make more sense to eschew those complex options pages in favor of just allowing the user to do it all “live”? With the Theme Customizer, this becomes entirely possible. As an added bonus, it also gives us a really handy use for the theme_mod system.
Step 1: Surfacing the Customizer
One thing I don’t like about the theme customizer is how hidden it is. It’s in the Themes selection space, under the strangely worded “Live Preview” option. Let’s bring that to the forefront and make it more visible for our example theme. In our functions.php file:
add_action ('admin_menu', 'themedemo_admin'); function themedemo_admin() { // add the Customize link to the admin menu add_theme_page( 'Customize', 'Customize', 'edit_theme_options', 'customize.php' ); }
There we go. Now we have a “Customize” link in the Appearance menu that loads up the customizer. Nice.
(Note, using the “customize.php” link works with the currently active theme only. Adding ?theme=themedemo to it would allow links to customize non-active themes, but this makes no real sense in the theme functions.php file of a theme. But if you were doing a plugin that needed to load the customizer, that might be good to know.)
Don’t do this anymore, kids. WordPress brought the Customize link to the surface in a later version.
Step 2: Adding some options
Let’s add some simple options to the theme customizer. How about a text field and, say, a color picker. Why not?
add_action('customize_register', 'themedemo_customize'); function themedemo_customize($wp_customize) { $wp_customize->add_section( 'themedemo_demo_settings', array( 'title' => 'Demonstration Stuff', 'priority' => 35, ) ); $wp_customize->add_setting( 'some_setting', array( 'default' => 'default_value', ) ); $wp_customize->add_control( 'some_setting', array( 'label' => 'Text Setting', 'section' => 'themedemo_demo_settings', 'type' => 'text', ) ); $wp_customize->add_setting( 'some_other_setting', array( 'default' => '#000000', ) ); $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'some_other_setting', array( 'label' => 'Color Setting', 'section' => 'themedemo_demo_settings', 'settings' => 'some_other_setting', ) ) ); }
We now have “some_setting” and “some_other_setting”. You can tell that I’m being very creative with my naming scheme here. 😉
Note that I didn’t define the “type” for these settings. This means they’ll be the default type, which is “theme_mod”, and that’s perfect for this case. Since we’re providing no other way than the customizer to change these settings, then it’s nice and easy to use them.
Speaking of using them…
Step 3: Use the settings in your theme
Here’s our theme’s index.php file:
<?php get_header(); ?> <h3>Theme Customizer Demo, using theme_mod and <em>no</em> settings page!</h3> <pre> <?php echo 'some_setting => ' .get_theme_mod( 'some_setting', 'default_value' )."\n"; echo 'some_other_setting => ' .get_theme_mod( 'some_other_setting', '#000000' )."\n"; echo 'non_existent_setting => '.get_theme_mod( 'non_existent_setting', 'default_value' )."\n"; ?> </pre> <?php get_footer(); ?>
The header and footer are pretty standard. Nothing special. You can find them in the download. What we’re really concerned with here is how the theme uses the settings themselves.
Notice the use of get_theme_mod. It’s pretty darned easy to use, really. It just gets the settings and uses them however the theme needs to. For this demo, I’m just outputting their contents for demonstration purposes. I also added in a non-existent setting to show that it works and outputs the default value when nothing is set for the theme in the theme_mod system.
The nice thing about theme_mod is that it automatically stores the information in a nice packed way, unique to the theme itself. If you have multiple copies of the same theme on the site, but with different names, each will have its own settings. Easy and handy.
Step 4: There is no step 4.
Seriously, that’s it. You can go further and make the settings work “live” using the postMessage methods I explained in the previous post, but for the most part, there’s nothing more to do. This is a simple and easy way of making settings, using them, and not worrying about complex options pages, settings in the database, where they’re stored… Why do all that extra code if you don’t have to?
Here’s a link to a working theme using the above concepts. For fun, it also supports custom background colors. 🙂
This is just one example of how to use the core APIs in a somewhat handy way. There’s other ways too. Feel free to experiment.