ユーザーができることを細かく指定するプラグインなどでは、ユーザーの役割(権限グループ)と共に多数の権限が追加されます。
これらの役割や権限はプラグインの削除などによって同時に削除されるのが望ましいものの、削除した後にユーザーに対する役割が失われてしまったり、権限による条件分岐などが正常に動作しなくなることを避けるため、そのままにするものがほとんどです。
もちろんこうした役割や権限は残しておいてもさして問題ないのですが、役割に関してはユーザープロフィール編集で権限グループの選択肢に残り続けることで誤って割り当ててしまうこともあるかもしれませんし、可能性は低いとは思いますが、権限についてもその権限を使ってカスタムコードを書くことで削除しにくい環境となってしまうこともあるでしょう。
何より余分なデータはできるだけ残したくないですしね。
そこで本ページでは、以下の件について紹介していきたいと思います。
- プラグインが追加した権限グループ(役割)や権限を見つける方法
- コードを使った権限グループの削除方法
- コードを使った権限の削除方法
- プラグインを使って追加された権限グループや権限を一括削除する(リセットする)方法
追加された権限グループや権限を見つける方法
権限グループの追加には「add_role()」、権限グループに権限を追加するときには「add_cap()」という関数が含まれていますので、プラグインやテーマのプログラムの中からこれらを探します。
..といっても目視で探すのは大変なので、「String Locator」というプラグインを使うといいでしょう。
「ツール」→「String Locator」を開いて、対象となるプラグインやテーマを選択後、上記の関数(()を省いた部分)を検索すれば容易に発見できます。
以下に例としてWooCommerceプラグインでの権限グループや権限について書いていますのでよかったら見てみてください。
例)WooCommerceプラグインで追加される権限グループと権限
例として商品の販売機能を追加できるプラグイン「WooCommerce」で追加される役割(権限グループ)と権限、プログラムコードを挙げておきますので興味のある方はプログラムコードを含めて参照してみてください。
追加される権限グループ
- customer
- shop_manager
追加される権限
- manage_woocommerce
- view_woocommerce_reports
- edit_product
- read_product
- delete_product
- edit_products
- edit_others_products
- publish_products
- read_private_products
- delete_products
- delete_private_products
- delete_published_products
- delete_others_products
- edit_private_products
- edit_published_products
- manage_product_terms
- edit_product_terms
- delete_product_terms
- assign_product_terms
- edit_shop_order
- read_shop_order
- delete_shop_order
- edit_shop_orders
- edit_others_shop_orders
- publish_shop_orders
- read_private_shop_orders
- delete_shop_orders
- delete_private_shop_orders
- delete_published_shop_orders
- delete_others_shop_orders
- edit_private_shop_orders
- edit_published_shop_orders
- manage_shop_order_terms
- edit_shop_order_terms
- delete_shop_order_terms
- assign_shop_order_terms
- edit_shop_coupon
- read_shop_coupon
- delete_shop_coupon
- edit_shop_coupons
- edit_others_shop_coupons
- publish_shop_coupons
- read_private_shop_coupons
- delete_shop_coupons
- delete_private_shop_coupons
- delete_published_shop_coupons
- delete_others_shop_coupons
- edit_private_shop_coupons
- edit_published_shop_coupons
- manage_shop_coupon_terms
- edit_shop_coupon_terms
- delete_shop_coupon_terms
- assign_shop_coupon_terms
とてつもない量の権限が追加されていますね。ちなみに実際に削除時にどうなるのかを確かめたところ、このプラグインでも停止や削除によってこれらが削除されることはありませんでした。
このプラグインを使わなくなった後でこれらの設定だけ残るのも..という感じがします。
以下がプログラムに書かれている対象となる部分です。
/* wp-content/plugins/woocommerce/includes/class-wc-install.php */
/* 役割の追加プログラム */
public static function create_roles() {
global $wp_roles;
if ( ! class_exists( 'WP_Roles' ) ) {
return;
}
if ( ! isset( $wp_roles ) ) {
$wp_roles = new WP_Roles(); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
}
// Dummy gettext calls to get strings in the catalog.
/* translators: user role */
_x( 'Customer', 'User role', 'woocommerce' );
/* translators: user role */
_x( 'Shop manager', 'User role', 'woocommerce' );
// Customer role.
add_role(
'customer',
'Customer',
array(
'read' => true,
)
);
// Shop manager role.
add_role(
'shop_manager',
'Shop manager',
array(
'level_9' => true,
'level_8' => true,
'level_7' => true,
'level_6' => true,
'level_5' => true,
'level_4' => true,
'level_3' => true,
'level_2' => true,
'level_1' => true,
'level_0' => true,
'read' => true,
'read_private_pages' => true,
'read_private_posts' => true,
'edit_posts' => true,
'edit_pages' => true,
'edit_published_posts' => true,
'edit_published_pages' => true,
'edit_private_pages' => true,
'edit_private_posts' => true,
'edit_others_posts' => true,
'edit_others_pages' => true,
'publish_posts' => true,
'publish_pages' => true,
'delete_posts' => true,
'delete_pages' => true,
'delete_private_pages' => true,
'delete_private_posts' => true,
'delete_published_pages' => true,
'delete_published_posts' => true,
'delete_others_posts' => true,
'delete_others_pages' => true,
'manage_categories' => true,
'manage_links' => true,
'moderate_comments' => true,
'upload_files' => true,
'export' => true,
'import' => true,
'list_users' => true,
'edit_theme_options' => true,
)
);
$capabilities = self::get_core_capabilities();
foreach ( $capabilities as $cap_group ) {
foreach ( $cap_group as $cap ) {
$wp_roles->add_cap( 'shop_manager', $cap );
$wp_roles->add_cap( 'administrator', $cap );
}
}
}
/* 権限の追加プログラム */
public static function get_core_capabilities() {
$capabilities = array();
$capabilities['core'] = array(
'manage_woocommerce',
'view_woocommerce_reports',
);
$capability_types = array( 'product', 'shop_order', 'shop_coupon' );
foreach ( $capability_types as $capability_type ) {
$capabilities[ $capability_type ] = array(
// Post type.
"edit_{$capability_type}",
"read_{$capability_type}",
"delete_{$capability_type}",
"edit_{$capability_type}s",
"edit_others_{$capability_type}s",
"publish_{$capability_type}s",
"read_private_{$capability_type}s",
"delete_{$capability_type}s",
"delete_private_{$capability_type}s",
"delete_published_{$capability_type}s",
"delete_others_{$capability_type}s",
"edit_private_{$capability_type}s",
"edit_published_{$capability_type}s",
// Terms.
"manage_{$capability_type}_terms",
"edit_{$capability_type}_terms",
"delete_{$capability_type}_terms",
"assign_{$capability_type}_terms",
);
}
return $capabilities;
}
foreachで回しているのでコード短めでたくさんの権限が追加されています(勉強になりますね)。
また、現在登録されている権限グループと権限の一覧を見たい場合は以下のコードを有効化しているテーマのfunctions.phpへ追加してみてください。管理画面の上部に権限グループとそれに紐づく権限がずらっと表示されます。
/*** 役割と権限の一覧を管理画面の通知欄に表示 ***/
function pwcn_dash_cap_list(){
$roles = wp_roles(); // WP_Rolesのインスタンス、$wp_rolesからも取得可
$names = wp_roles()->role_names; // 名前のハッシュ
$roles = wp_roles()->role_objects; //WP_Roleのハッシュ
foreach($roles as $role){
echo '<div class="updated">';
echo "ロール名:{$role->name}<br />";
foreach( $role->capabilities as $cap => $grunt ){
echo " * {$cap} : {$grunt}<br />";
}
echo '</div>';
}
}
add_action('admin_notices', 'pwcn_dash_cap_list');
出典:WordPressプラグイン作成、ユーザーと権限と愉快ななk・・・ メモ。
上記コードを削除すれば表示は消えます
コードを使った権限グループや権限の削除方法
権限グループ(Role)の削除
権限グループを削除する方法については以下のページの最後で書いていますので参照ください。
権限(Capability)の削除
以下のコードを有効化しているテーマのfunctions.phpへ追加し、「権限のスラグ」となっている部分を削除対象のスラグに変えて、「ファイルを更新」をクリックして保存すると、対象となる権限を削除することができます。
function pwcn_remove_custom_capability_from_all_roles() {
// 削除したい権限を指定
$custom_capability_to_remove = '権限のスラグ';
// すべての権限グループを取得
$roles = wp_roles()->roles;
// カスタムキャパビリティをすべての権限グループから削除
foreach ($roles as $role_name => $role_info) {
$role = get_role($role_name);
if ($role) {
$role->remove_cap($custom_capability_to_remove);
}
}
}
add_action('admin_init', 'pwcn_remove_custom_capability_from_all_roles');
最終行のアクションフックは1度稼働させれば(一度テーマファイルエディターを保存すれば)権限は削除されるので、必要なければユーザー定義関数ごと削除するか、add_action(..の前に「//」を入れて無効にしておけばいいでしょう
もしも誤って削除してしまった場合には、プラグインであれば一度プラグインを停止して再有効化し、テーマであれば一旦別のテーマへ変更してから元に戻せば復活します。これは「add_cap」という権限グループへ権限の追加を行うWordPress組み込み関数を使っているからで、プラグインやテーマが最初に読み込まれる(有効になる)時に発動するからです。
追加された権限グループや権限を一括削除する(リセットする)方法
最後に権限グループや権限をいちいち調べて削除するのが大変という方へ、プラグインを使って一括削除する方法を紹介します。
使用するのは「Reset Roles and Capabilities」というプラグインです。検索するとすぐに発見できますが、このプラグインは管理画面を持たず、有効化と共に削除処理が走るものですので、以下の説明やプラグイン公式ページの内容に納得するまではインストールするだけで有効化はしないでください。
公式ページの説明文やサポートフォーラムの回答でも示されている通り、イメージとしてはすべての権限グループと権限を一旦削除してWordPress標準の権限グループとそれに紐づく権限を再生成して元に戻すという動作をします。
テストサイトで試した限りではきちんとリセットされましたが、環境によっては不具合が起きる可能性がありますので、万が一そうなった時に備えてサイトの完全なバックアップを取ることと、復元できるスキルを身に着けていることが必要でしょう。
また、権限グループや権限の追加を行うプラグインが有効化されている状態でこのプラグインを有効化(実行)した場合、WordPress標準の権限グループと権限に戻ってしまうので、プラグインで権限グループや権限を使用した機能が動作しなくなりますから、そうなった場合には一旦プラグインを停止し、再有効化することで問題は解決しました。
ただし、思わぬ不具合が出る危険性はあると思いますので、前述したようにバックアップと復元の準備をしてから試すか、サブディレクトリなどへ現行のサイトを複製して十分にテストを行った上で現行のサイトでも措置を行うといった対応をした方がよいでしょう。
コメントを残す