It looks like you want to register custom taxonomies within shortcodes, but here’s an important notice from the Codex on the register_taxonomy
function:
Use the
init
action to call this function. Calling it outside of an
action can lead to troubles. See #15568 for details.
Here’s an example of the action run sequence from my Twenty Fifteen home page:
muplugins_loaded <-- FIRST HOOK AVAILABLE
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_taxonomy
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
plugins_loaded
sanitize_comment_cookies
setup_theme
unload_textdomain
load_textdomain
after_setup_theme
load_textdomain
load_textdomain
auth_cookie_malformed
auth_cookie_valid
set_current_user
init <-- RECOMMENDED HOOK TO REGISTER TAXONOMIES
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_post_type
registered_taxonomy
registered_taxonomy
registered_taxonomy
… continue
registered_taxonomy
registered_taxonomy
widgets_init
register_sidebar
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_register_sidebar_widget
wp_loaded
parse_tax_query
parse_tax_query
posts_selection
parse_tax_query
parse_tax_query
… continue
posts_selection
template_redirect
admin_bar_init
add_admin_bar_menus
get_header
wp_head
wp_enqueue_scripts
wp_print_styles
wp_print_scripts
get_sidebar
dynamic_sidebar_before
dynamic_sidebar
<-- YOU ARE TRYING TO REGISTER TAXONOMIES HERE
dynamic_sidebar_after
… and so on
So we can see that trying to register taxonomies with shortcodes inside widgets, happens deep inside the theme code, long way from the recommended init
hook.
PS: I would in general recommend using prefixed shortcode names, instead of general ones like taxonomy
or taxnomy
, to avoid possible name collision.
Workaround
There might be a way around this, by peeking into the database within a init
hook callback and search for the shortcode instances in the widget_text
option. If it exists then we could register the custom taxonomy. We also don’t want to register the same taxonomy multiple times. We would also have to check if the widget is active or inactive. I don’t know if this is a good idea in general.