I'm working on a theme that use the WordPress Theme Customization API.

Everything is working as it should, except on initial theme install.

Some of my options need to be set straight away on theme install.

After looking around it seems that setting the default arg in the add_setting option should set the option right away, but it's not.

Here's a short excerpt of my code:

add_action( 'customize_register', 'generate_customize_register' );
function generate_customize_register( $wp_customize ) {

    // Add Layout section
            'title' => __( 'Layout', 'generate' ),
            'capability' => 'edit_theme_options',
            'description' => __( 'Allows you to edit your theme\'s layout.', 'generate' ),
            'priority' => 30

    // Add Header Layout setting
        // ID
        // Arguments array
            'default' => 'fluid-header',
            'type' => 'option'

    // Add Header Layout control
    // ID
    // Arguments array
        'type' => 'select',
        'label' => __( 'Header Layout', 'generate' ),
        'section' => 'layout_section',
        'choices' => array(
            'fluid-header' => __( 'Fluid / Full Width', 'generate' ),
            'contained-header' => __( 'Contained', 'generate' )
        // This last one must match setting ID from above
        'settings' => 'generate_settings[header_layout_setting]',
        'priority' => 1

As you can see, I created a section, a setting with a default and a control for that setting.

When I go to the Theme Customizer and save the options, a generate_settings table is created in the database with the options inside, as it should be.

However, on a fresh install of the theme, if I go into the database, no generate_settings table exists - the settings are only added to the database when I go into the Theme Customizer and save the options.

Am I doing something wrong? Is there anything I can do to populate the database with these settings on fresh theme install?


1 Answer 1


Use default values when you fetch the settings. Never store defaults in the database.


$defaults = array (
    'foo' => 'bar'

$options = get_option( 'my_theme_options', $defaults );

echo $options['foo'];
  • No wonder I couldn't find the answer, it was too simple. This works perfectly, thank you!
    – Tom
    Apr 6, 2014 at 17:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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