web-dev-qa-db-ja.com

分類法を「ロック」する方法はありますか?

分類法に新しいカテゴリーを追加することを防ぐ方法、基本的に分類法を「ロックする」方法があるかどうか私は思っていました。

私はプログラム的に分類法を登録し、functions.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' );
6
Drew Gourley

カテゴリー、タグ、分類法

まず、これを明確にしたいと思います。すべてが分類法です。タグは非階層的で、カテゴリは階層的で、両方ともビルトイン分類法です。例えば同じことが言えます。投稿フォーマット(脇、チャットなど)。投稿タイプと同じ概念です(投稿、ページ、添付ファイル、nav_menu_itemなどはすべて投稿タイプに組み込まれています)。

これらの分類のうちの1つの内部にあるものはすべて用語です。例えば。 (内部の投稿フォーマット) "脇"、 "引用"、 "音声"。

コーデックスリンク

  • register_taxonomy() - exから分類法を登録することができます。 functions.phpファイルの中。
  • wp_insert_term() - 用語を登録することができます
  • wp_delete_term() - 用語を削除することができます
  • get_terms() - 与えられた分類法からすべての用語を検索することができます。

コンセプト

以下はあなたのfunctions.phpファイルのためのものです。これはすべてのページリクエストでトリガーされます。あなたはそれを改善することができます - トランジェントAPI を使用して - 与えられたタイムスタンプ(例えば1日に2回、毎時など)でトリガーするように。

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' );
3
kaiser

独立して用語を分類法に追加していて、UIを非表示にしたい場合は、register_taxonomyのサポートされている引数を2つ使用しないでください。

ケーパビリティ
(配列)(オプション)この分類法の機能の配列。

デフォルト:なし

'manage_terms' - 'manage_categories'
'edit_terms' - 'manage_categories'
'delete_terms' - 'manage_categories'
'assign_terms' - 'edit_posts'

show_ui
(ブール値)(オプション)この分類法を管理するためのデフォルトのUIを生成するかどうか。

デフォルト:設定されていない場合、デフォルトはパブリック引数の値になります

機能を存在しない機能に設定すると、基本的にユーザーがそれらを変更、作成、または削除できなくなります。もしあなたがそれらを伝統的な方法で(つまりポストエディタを介して)ポストに割り当てることができるようにする必要があるならば、単にassign_terms値のために本当の能力を使いなさい。

例:

$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に設定すると、分類のためにメニュー項目が表示されなくなります。

それが役立つことを願っています...

6
t31os