如何使用短码创建自定义分类?

时间:2015-09-05 作者:Hafiz Usman aftab

我想使用短代码创建自定义分类法。我不想使用任何插件。我在插件中使用以下代码:

add_shortcode(\'taxnomy\',\'project_taxonomy_init\');

add_filter( \'widget_text\', \'do_shortcode\');

function project_taxonomy_init() {
    //create a new taxonomy
    register_taxonomy(
        \'skills\',
        \'projects\',
        array(
            \'labels\' => array(
                //\'supports\' => array( 
                //      \'title\', \'editor\', \'comments\', \'excerpt\', \'custom-fields\', \'thumbnail\' 
                //),
                \'name\' => __( \'Skills\' ),
                \'singular_name\' => __( \'skills\' ),
                \'edit_item\' => __( \'Edit Skill\' ),
                \'update_item\' => __(\'Update Skill\' ),
                \'new_item_name\'=>__(\'New Skill Name\'),
                \'all_items\'=>__(\'All Skill Name\'),
                \'add_new_item\'=>__(\'Add New Skill\'),
                \'search_items\'=>__(\'Seacrh Skill Name\'),
                \'popular_items\' => __( \'Popular Skill\' ),
                \'separate_items_with_comments\' => __( \'Separate Items With Comments\'   ),
                \'add_or_remove_items\'=>__(\'Add Or Remove Items\'),
                \'choose_from_most_used\'=>__(\'Choose From Most Used\'),
            ),
            \'public\'          => true,
            \'hierarchical\'    => true,
            \'rewrite\'         => array(
                \'slug\'          => \'skills\',
                \'with_front\'    => true
            ),
        )
    );
}

1 个回复
最合适的回答,由SO网友:birgire 整理而成

看起来您想在短代码中注册自定义分类法,但这里有一个important notice 来自register_taxonomy 功能:

使用init 调用此函数的操作。在操作之外调用它可能会导致麻烦。看见#15568 有关详细信息。

下面是action run sequence 从我的主页:

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
。。。持续

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
。。。持续

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
。。。等等

因此,我们可以看到,尝试在小部件中使用短代码注册分类法,发生在主题代码的深处,与推荐的方法相去甚远init

PS:我通常建议使用prefixed 短代码名称,而不是像taxonomytaxnomy, 以避免可能的名称冲突。

解决方法

可能有一种方法可以解决这个问题,方法是在init 钩住回调并在widget_text 选项如果它存在,那么我们可以注册自定义分类法。我们也不想多次注册相同的分类法。我们还必须检查小部件是否处于活动状态。总的来说,我不知道这是不是个好主意。

相关推荐

Execute shortcodes in PHP

我在帖子编辑器中添加了一个地理位置快捷码,可以根据用户的位置显示不同的信息,将其放在帖子页面的内容中,效果非常好。如何在主题的PHP文件中执行此短代码[地理位置][地理位置]?我正在使用免费修改Wordpress主题,我想添加一个新的<span>[geolocation][/geolocation]Information text content</span> 但在主题的内部。php文件,我如何才能做到这一点?如果我直接加上<span>[geolocation][/ge