It’s because you’re using esc_html
to sanitize the setting, which converts all the <
,>
etc. into HTML entities, like >
, which render as <
but aren’t treated as those characters in terms of HTML, which is why tags aren’t rendering correctly. esc_html
is supposed to be use for outputting HTML so that the markup is visible to the reader.
If you want to sanitize HTML, use wp_kses_post
as the sanitization callback.
EDIT: Suggest wp_kses_post
, rather than wp_kses
, as per Tom’s comment.