有没有办法“锁定”一个分类法?

时间:2011-04-09 作者:Drew Gourley

我想知道是否有办法防止在分类法中添加新类别,本质上是“锁定”分类法。

我正在通过编程注册一个分类法,并通过函数用术语填充它。php和希望它,所以你不能再添加到它。

实现的愿景

这是我的解决方案的最终结果,它工作得很好!感谢所有帮助过我的人。在你面前到处投票!

// some stuff happens before this...
    $labels = array(
        \'name\' => _x( \'Attendees\', \'taxonomy general name\' ),
        \'singular_name\' => _x( \'Attendee\', \'taxonomy singular name\' ),
        \'search_items\' =>  __( \'Search Attendees\' ),
        \'all_items\' => __( \'All Attendees\' ),
        \'edit_item\' => __( \'Edit Attendee\' ), 
        \'update_item\' => __( \'Update Attendee\' ),
        \'add_new_item\' => __( \'Add New Attendee\' ),
        \'new_item_name\' => __( \'New Attendee Name\' ),
        \'menu_name\' => __( \'Attendees\' )
    );
    $rewrite = array(
        \'slug\' => \'attendee\'
    );
    $capabilities = array(
        \'manage_terms\' => \'nobody\',
        \'edit_terms\' => \'nobody\',
        \'delete_terms\' => \'nobody\',
        \'assign_terms\' => \'nobody\'
    );
    $args = array(
        \'hierarchical\' => true,
        \'labels\' => $labels,
        \'show_ui\' => true,
        \'query_var\' => \'attendee\',
        \'rewrite\' => $rewrite,
        \'capabilities\' => $capabilities
    );
    register_taxonomy(\'attendees\', \'meetings\', $args);
}
add_action( \'init\', \'todo_create_taxonomies\', 1);
function todo_register_attendees() {
    $users = get_users();
    foreach ( $users as $user ) {
        wp_insert_term( $user->display_name, \'attendees\', array(\'description\'=> $user->display_name, \'slug\' => $user->user_nicename) );
        $lockdown[] = $user->user_nicename;
    }
    $terms = get_terms(\'attendees\', array(\'get\' => \'all\') );
    foreach ($terms as $term) {
        if ( !in_array($term->slug, $lockdown) ) {
            wp_delete_term( $term->term_id, \'attendees\' );
            $message = new WP_Error(\'force_terms\', __(\'Only Registered Users can be Attendees, \' . $term->name . \' has been deleted.\'));
            if ( is_wp_error($message) ) { ?>
                <div id="aphid-error-<?php echo $message->get_error_code(); ?>" class="error aphid-error"> 
                    <p><strong><?php echo $message->get_error_message(); ?></strong></p>
                </div>
            <?php }
        }
    }
}
add_action( \'admin_notices\', \'todo_register_attendees\' );

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

类别、标记和分类法首先我想明确一点:一切都是Taxonomy. 标记是非层次的,类别是层次的,两者都是内置的分类法。同样适用于post格式(旁白、聊天等)。这与帖子类型的概念相同(帖子、页面、附件、nav\\u menu\\u项目等都是内置的帖子类型)。

其中一个分类法中的所有内容都是Term. 例如(内部帖子格式)“旁白”、“引用”、“音频”。

Codex Links

  • register_taxonomy() - 允许您在functions.php 文件
  • wp_insert_term() - 允许您注册术语wp_delete_term() - 允许您删除术语get_terms() - 允许您从给定的分类中检索所有术语functions.php 文件这会在每个页面请求上触发。你可以改进它-using the Transients API - 根据给定的时间戳触发(例如每天两次、每小时一次等)。

    function wpse14350_cleanup_taxonomy_terms()
    {
        // Define your terms inside this array
        $predefined_terms = array(
             \'term A\'
            ,\'term B\'
            ,\'term C\'
        );
        // Name your taxonomy here
        $predefined_taxonomy = \'category\';
    
        $all_terms_inside_tax = get_terms( 
             $predefined_taxonomy
            ,array(
                 \'hide_empty\'   => false
                ,\'taxonomy\'     => $predefined_taxonomy
            ) 
        );
    
        foreach ( $all_terms_inside_tax as $term )
        {
            if ( ! in_array( $term->name, $predefined_terms ) )
                wp_delete_term( $term->term_id, $predefined_taxonomy );
        }
    }
    add_action( \'init\', \'wpse14350_cleanup_taxonomy_terms\' );
    

SO网友:t31os

如果要独立地将术语添加到分类法中,并且要隐藏UI,为什么不简单地使用register_taxonomy\'s支持的参数。

capabilities
(数组)(可选)此分类法的功能数组。

默认值:无

“manage\\u terms”-“manage\\u categories”-“edit\\u terms”-“manage\\u categories”-“delete\\u terms”-“manage\\u categories”-“assign\\u terms”-“edit\\u posts”

show_ui
(布尔)(可选)是否生成用于管理此分类的默认UI。

默认值:如果未设置,则默认为公共参数的值

将这些功能设置为一些不存在的功能,您将从本质上阻止用户修改、创建或删除它们。如果您需要能够以传统方式(即通过帖子编辑器)将它们分配给帖子,只需使用assign_terms 价值

Example:

$args = array(

....

    \'capabilities\' => array(
        \'manage_terms\' => \'foobar\',
        \'edit_terms\'   => \'foobar\',
        \'delete_terms\' => \'foobar\',
        \'assign_terms\' => \'foobar\' // <-- change this one to a desired cap if you need to be able to assign them(you could use manage_options for admins only)
    ),
);
设置show_ui 如果设置为false,则将阻止显示分类法的任何菜单项。

希望这有助于。。。

结束

相关推荐

从Terms()函数中去掉标记

正在尝试打印自定义帖子类型的分类法,但没有链接。尝试过这个,但似乎不起作用,有什么建议吗?$text = the_terms($post->ID,\'type\',\'\',\'\',\'\'); echo strip_tags($text); 任何帮助都将不胜感激。。。我要开始揍婴儿了。