Why does get_theme_mod return blank (or default value) but get_option returns saved value?

Why does get_theme_mod return blank (or the default value if specified) but get_option returns the correct (saved) value?

I have a colour picker in the customizer color-primary which functions correctly and saves selected value to the database, however, get_theme_mod returns blank while get_option returns the saved value.

echo get_option('color-primary'); //returns saved value
echo get_theme_mod('color-primary'); // returns blank
echo get_theme_mod('color-primary', '#fafafa'); // returns default value

1 Answer
1

This is original code from wordpress:

function get_theme_mods()
{
    $theme_slug = get_option('stylesheet');
    $mods = get_option("theme_mods_$theme_slug");
    if (false === $mods)
    {
        $theme_name = get_option('current_theme');
        if (false === $theme_name)
            $theme_name = wp_get_theme()->get('Name');
        $mods = get_option("mods_$theme_name"); // Deprecated location.
        if (is_admin() && false !== $mods)
        {
            update_option("theme_mods_$theme_slug", $mods);
            delete_option("mods_$theme_name");
        }
    }

    return $mods;
}

function get_theme_mods()
{
    $theme_slug = get_option('stylesheet');
    $mods = get_option("theme_mods_$theme_slug");
    if (false === $mods)
    {
        $theme_name = get_option('current_theme');
        if (false === $theme_name)
            $theme_name = wp_get_theme()->get('Name');
        $mods = get_option("mods_$theme_name"); // Deprecated location.
        if (is_admin() && false !== $mods)
        {
            update_option("theme_mods_$theme_slug", $mods);
            delete_option("mods_$theme_name");
        }
    }

    return $mods;
}

As you can see get_theme_mods uses get_option, but it does not use your key that you provided to save your data with, instead it uses your theme name as a key to fetch or save your theme data. Now if you fetch data with get_theme_mod() it will first get_option("theme_mods_$yourthemename") and then it parses the returned value where your saved theme options actually are.

Leave a Comment