在我的WordPress插件中,我使用以下代码为所有已安装的Taxonimies自动添加Meta Box:
add_action( 'init', 'my_plugin_register_taxonomies_for_object_type');
function my_plugin_register_taxonomies_for_object_type()
{
$args = array(
'public' => true,
);
$output = 'objects';
$taxonomies = get_taxonomies( $args, $output );
foreach ( $taxonomies as $taxonomy )
{
register_taxonomy_for_object_type( $taxonomy->name, 'jt_condet_content' );
}
}
这适用于所有Taxonmies,甚至是通过插件安装的Taxonmies。但是,我注意到缺少一个分类法。这是一个普通的Post Taxonomy,由主题使用register_taxonomy()
在主题的init
钩子中安装。
我知道为什么我的插件my_plugin_register_taxonomies_for_object_type()
错过了这个分类法?它让我疯狂。我想显示所有已安装的公共分类法的元框,无论它们是否已内置,通过插件安装或通过主题安装。
我使用动作挂钩玩了一下,wp_loaded
似乎有效,但我不是100%确信这是正确使用的挂钩,还是我很好?
你能否解释一下使用wp_loaded
而不是init
的缺点?
答案 0 :(得分:0)
如果您使用init
并且子主题也使用init
,您可能只需要更改 挂钩的优先级,以确保其运行在之后。尝试做:
add_action( 'init', 'my_plugin_register_taxonomies_for_object_type', 20 );
假设他们的主题使用默认值(10),你的主题将在他们的主题之后运行,并且他们的分类法应该可用。
我可以考虑使用wp_loaded
的唯一缺点是wp_loaded
会在之后运行一些其他操作,例如widgets_init
,register_sidebar
可能还有其他几个。如果其他插件/主题有任何其他插件/主题要求您的帖子类型注册这些分类,和他们在wp_loaded
之前挂钩,他们就会失败,因为wp_loaded
在他们之后运行。在大多数情况下,wp_loaded
可能会很好。