web-dev-qa-db-ja.com

管理者へのカスタムロール機能が有効にならない(プラグインなし)

プラグインからカスタム投稿タイプを作成しました。機能タイプteacherを追加しました。それから私は管理者にカスタム機能を追加しました。しかし、問題は、このコードを完成した後で初めて、ロールに前述の機能を追加することです。しかし、それをさらに変更しても効果はありません。私が今関数roles_to_edit_teacherを削除するかのように、それでも管理者は機能を持つでしょう。では、どうやってこの問題を解決するのですか?

 function plugin_main_functions(){
 register_post_type( 'teachers'、array(
 'labels' => array(
 'name' => __( 'Teachers List '、'教師 ')、
' add_new '=> __('新しい教師の追加 '、'教師 ')、
' add_new_item '=> __('新しい教師の追加 '、'教師')
)、
' public '=> true、
'は '=> array(' title '、' editor '、' thumbnail ')をサポートしています。 ] 'menu_icon' => 'dashicons-groups'、
 'capability_type' =>配列( '教師'、 '教師')、
 'map_meta_cap' => true 
 [ add_action( 'init'、 'plugin_main_functions'); 
 
 function roles_to_edit_teacher(){[ $ admin = get_role( 'administrator'); 
 
 
 $ admin-> add_cap( 'edit_teacher'); 
 $ admin-> add_cap( 'edit_teachers'); 
 $ admin-> add_cap( 'read_teacher'); 
 $ admin-> add_cap( 'delete_teacher'); 
 $ admin - > add_cap( 'delete_teachers'); 
 $ admin-> add_cap( 'publish_teacher'); 
 $ admin-> add_cap( 'create_teachers'); 
} 
 add_action( 'init'、 'roles_to_edit_teacher'); [。 
 
1
Apple

機能はデータベースに保存されるため、機能を削除しても機能はアクティブなままです。機能を明示的に削除する必要があります。

$admin  = get_role('author');
$admin->remove_cap( 'edit_teacher' );

そして、それらはデータベースに格納されているので、(initイベントで行っているように)ページロードのたびにそれらを追加するのを止めるべきです。通常は、プラグインアクティベーションフックにカスタム機能を追加し、プラグインアクティベーション解除時にそれらを削除する必要があります。

add_action('init','plugin_main_functions');
function plugin_main_functions(){
  register_post_type('teachers', array(
    'labels' => array(
        'name'=>__('Teachers List', 'Teachers'),
        'add_new' => __('add new teacher', 'Teachers'),
        'add_new_item' => __('Add new teacher', 'Teachers')
        ),
    'public' => true,
    'supports'=> array('title', 'editor', 'thumbnail'),
    'menu_icon' => 'dashicons-groups',
    'capability_type' => array('teacher','teachers'),
    'map_meta_cap' => true

  ));

}

register_activation_hook( __FILE__, function () {

    // Call function plugin_main_functions(),
    // The function where the custom post type is registered
    plugin_main_functions();

    $admin = get_role('administrator');

    $admin->add_cap('edit_teacher');
    $admin->add_cap('edit_teachers');
    $admin->add_cap('read_teacher');
    $admin->add_cap('delete_teacher');
    $admin->add_cap('delete_teachers');
    $admin->add_cap('publish_teacher');
    $admin->add_cap('create_teachers');

    flush_rewrite_rules();

} );

register_deactivation_hook( __FILE__, function () {

    // Call function plugin_main_functions(),
    // The function where the custom post type is registered
    plugin_main_functions();

    $admin = get_role('administrator');

    $admin->remove_cap('edit_teacher');
    $admin->remove_cap('edit_teachers');
    $admin->remove_cap('read_teacher');
    $admin->remove_cap('delete_teacher');
    $admin->remove_cap('delete_teachers');
    $admin->remove_cap('publish_teacher');
    $admin->remove_cap('create_teachers');

    flush_rewrite_rules();

} );

その後、プラグインのアクティブ化中に別のイベントで機能を変更する必要がある場合は、機能を追加または削除する前にいくつかのチェックを行って、不要なデータベース操作を実行しないでください。

例えば:

add_action('init','plugin_main_functions');
function roles_to_edit_teacher(){
    if( $i_neet_to_remove_cap === true ) {
        $admin = get_role('administrator');
        $admin->remove_cap('some_capability');
    }
    if( $i_neet_to_add_cap === true ) {
        $admin = get_role('administrator');
        $admin->add_cap('some_capability');
    }
}
1
cybmeta