First of all, When you uncheck `Display Site Title and Tagline` in the customizer, it doesn't matter what value you've already put in `Header Text Color`, the customizer saves it as `blank` (not empty string, the actual text "blank") after you `Save & Publish`. You may check this in `wp_options` table in the database after you `Save & Publish or try `var_dump()` after moving out of the customizer. Since `get_header_textcolor()` returns `blank` and `get_theme_support( 'custom-header', 'default-text-color' )` returns `000000`, they don't match in the above mentioned `if` condition, so the hiding works. Secondly, you get `000000` with `var_dump()` for both `get_header_textcolor()` and `get_theme_support( 'custom-header', 'default-text-color' )` when you are in the customizer because, customizer don't reload the page after saving & use JavaScript to show / hide before saving. If you close customizer, you'll see `var_dump()` will show `blank` for `get_header_textcolor()` and `000000` for `get_theme_support( 'custom-header', 'default-text-color' )`. This is the line customizer use to save the value as `blank` in the [`wp-admin/js/customize-controls.js`][1] file: control.setting.set( to ? last : 'blank' ); Also, in [`wp-includes/class-wp-customize-manager.php`][2] file's `_sanitize_header_textcolor` function, you'll see that WordPress allows `blank` to be a valid input for header-text-color other than valid color value in hex format: if ( 'blank' === $color ) return 'blank'; So your logic was correct, but you got the value wrong. [1]: https://core.trac.wordpress.org/browser/tags/4.7.2/src/wp-admin/js/customize-controls.js#L5264 [2]: https://core.trac.wordpress.org/browser/tags/4.7.2/src/wp-includes/class-wp-customize-manager.php#L4197