2026年10月21日

2026年10月21日

WordPressのユーザー権限エラーを解決する方法

はじめに

WordPressの管理画面で「申し訳ありませんが、このページにアクセスする権限がありません。」というエラーが表示される・管理者ユーザーなのにプラグイン管理・テーマ変更・ユーザー管理のメニューが表示されない・サイト移転後にユーザー権限がリセットされた・current_user_can()が期待通りに機能しないといった問題は、ユーザーロールのケイパビリティ(capabilities)の破損・wp_user_rolesオプションの不整合・マルチサイトの権限設定の問題が原因です。

症状・原因

  • wp_capabilitiesユーザーメタに不正な値が入っている
  • プラグインがカスタムロールを追加しwp_user_rolesオプションを破損させた
  • スーパー管理者のはずが通常の管理者として登録されている
  • add_role()で追加したカスタムロールのケイパビリティが不足している

解決手順

ステップ1:ユーザー権限の状態を診断する

# ユーザーのロールとケイパビリティを確認
wp eval "
\$user = get_user_by('login', 'admin');
if (!\$user) {
    echo 'User not found' . PHP_EOL;
    exit;
}
echo 'User ID: '    . \$user->ID . PHP_EOL;
echo 'Roles: '      . implode(', ', \$user->roles) . PHP_EOL;
echo 'Caps (raw): '  . print_r(\$user->caps, true) . PHP_EOL;

// 主要なケイパビリティを確認
\$caps = ['manage_options', 'edit_posts', 'publish_posts', 'activate_plugins', 'edit_themes'];
foreach (\$caps as \$cap) {
    echo \$cap . ': ' . (user_can(\$user->ID, \$cap) ? 'yes' : 'no') . PHP_EOL;
}
"

# wp_user_rolesオプションの整合性確認
wp eval "
\$roles = get_option('wp_user_roles');
echo 'Registered roles: ' . implode(', ', array_keys(\$roles)) . PHP_EOL;
echo 'administrator caps count: ' . count(\$roles['administrator']['capabilities']) . PHP_EOL;
"

# 全ユーザーのロールを確認
wp user list --fields=ID,user_login,roles

ステップ2:ユーザーロールを修正する

# ユーザーのロールをadministratorに設定
wp user set-role 1 administrator

# 複数ユーザーを一括でロール変更
wp eval "
\$users = get_users(['role' => 'subscriber', 'number' => -1]);
foreach (\$users as \$user) {
    if (strpos(\$user->user_email, '@yourdomain.com') !== false) {
        wp_update_user(['ID' => \$user->ID, 'role' => 'editor']);
        echo 'Changed ' . \$user->user_login . ' to editor' . PHP_EOL;
    }
}
"

# ユーザーのcapabilitiesを直接修正
wp eval "
\$user_id = 1;
\$user = new WP_User(\$user_id);
\$user->set_role('administrator');
echo 'Role set to administrator' . PHP_EOL;

// 特定のケイパビリティを追加
\$user->add_cap('manage_options');
\$user->add_cap('activate_plugins');
echo 'Capabilities added' . PHP_EOL;
"
// functions.php: 管理者ロールのケイパビリティをリセット
add_action('init', function(): void {
    $role = get_role('administrator');
    if (!$role) {
        return;
    }

    // 管理者に必要な全ケイパビリティを確認・追加
    $required_caps = [
        'activate_plugins', 'delete_plugins', 'edit_plugins', 'install_plugins',
        'edit_themes', 'switch_themes', 'install_themes', 'delete_themes',
        'manage_options', 'manage_network', 'create_users', 'delete_users',
        'edit_users', 'list_users', 'promote_users', 'remove_users',
    ];

    foreach ($required_caps as $cap) {
        if (!$role->has_cap($cap)) {
            $role->add_cap($cap);
        }
    }
}, 1);

ステップ3:wp_user_rolesオプションを修復する

# デフォルトのロール定義をリストア
wp eval "
// WordPressデフォルトのロールを再インストール
require_once ABSPATH . 'wp-admin/includes/schema.php';
populate_roles();
echo 'Default roles restored' . PHP_EOL;
"

# 破損したwp_user_rolesを削除して再生成
wp option delete wp_user_roles
wp eval "
require_once ABSPATH . 'wp-admin/includes/schema.php';
populate_roles();
echo 'wp_user_roles regenerated' . PHP_EOL;
"
// functions.php: カスタムロールを正しく追加する
add_action('init', function(): void {
    // 既存のロールを削除してから再作成(冪等性を確保)
    remove_role('content_manager');

    add_role('content_manager', 'コンテンツ管理者', [
        'read'                  => true,
        'edit_posts'            => true,
        'edit_published_posts'  => true,
        'publish_posts'         => true,
        'delete_posts'          => true,
        'delete_published_posts'=> true,
        'upload_files'          => true,
        'edit_pages'            => true,
        'edit_published_pages'  => true,
        'publish_pages'         => true,
        'manage_categories'     => true,
    ]);
});

// カスタムロールに動的にケイパビリティを追加
add_filter('user_has_cap', function(array $allcaps, array $caps, array $args): array {
    $user = get_user_by('id', $args[1]);
    if (!$user || !in_array('content_manager', $user->roles, true)) {
        return $allcaps;
    }
    // カスタムケイパビリティを付与
    if (in_array('edit_others_posts', $caps, true)) {
        $allcaps['edit_others_posts'] = true;
    }
    return $allcaps;
}, 10, 3);

ステップ4:特定ページへのアクセス制御を設定する

// functions.php: 権限に基づいてメニューを表示・非表示
add_action('admin_menu', function(): void {
    // 管理者以外にはプラグインメニューを非表示
    if (!current_user_can('activate_plugins')) {
        remove_menu_page('plugins.php');
    }

    // エディター以上にカスタムメニューを追加
    if (current_user_can('edit_posts')) {
        add_menu_page(
            'コンテンツ管理',
            'コンテンツ',
            'edit_posts',
            'content-manager',
            function(): void {
                echo '<div class="wrap"><h1>コンテンツ管理</h1></div>';
            },
            'dashicons-edit',
            25
        );
    }
});

// 管理画面へのアクセスを権限でブロック
add_action('admin_init', function(): void {
    if (is_admin() && !current_user_can('edit_posts') && !wp_doing_ajax()) {
        wp_die('このページにアクセスする権限がありません。', 403);
    }
});

ステップ5:マルチサイトのスーパー管理者権限を修正する

# マルチサイトのスーパー管理者を確認
wp super-admin list

# スーパー管理者を追加
wp super-admin add admin

# スーパー管理者を削除
wp super-admin remove username
// functions.php: マルチサイトでのスーパー管理者判定
add_filter('user_has_cap', function(array $allcaps, array $caps, array $args): array {
    if (!is_multisite()) {
        return $allcaps;
    }

    $user_id = $args[1];
    if (is_super_admin($user_id)) {
        // スーパー管理者には全ケイパビリティを付与
        foreach ($caps as $cap) {
            $allcaps[$cap] = true;
        }
    }
    return $allcaps;
}, 10, 3);

// 特定のユーザーIDに一時的に権限を付与
add_filter('user_has_cap', function(array $allcaps, array $caps, array $args): array {
    $temp_admin_ids = [5, 12];  // 一時的に管理者権限を付与するユーザーID
    if (in_array($args[1], $temp_admin_ids, true)) {
        $allcaps['manage_options'] = true;
    }
    return $allcaps;
}, 10, 3);

注意事項

  • wp_user_rolesオプションを手動で削除する前に必ずバックアップを取ってください。ロール定義が消えると全ユーザーがログインできなくなる場合があります
  • user_has_capフィルターを使用して権限を付与する場合、パフォーマンスへの影響に注意してください。全リクエストで実行されるため、重い処理は避けてください
  • マルチサイトでスーパー管理者に設定したユーザーはネットワーク全体に対する全権限を持ちます。必要最小限のユーザーだけをスーパー管理者にしてください

まとめ

WordPressユーザー権限エラーの解決は①user_can()でケイパビリティを確認・wp_user_rolesのロール定義を確認・wp user listでユーザーのロール一覧を確認、②wp user set-roleでロールを変更・WP_User::add_cap()で個別ケイパビリティを付与・WP_User::set_role()でロールを設定、③populate_roles()でデフォルトロールを再生成・wp option delete wp_user_rolesで破損したロール定義をリセット・add_role()でカスタムロールを正しく定義、④admin_menuフックでケイパビリティに基づきメニュー表示を制御・user_has_capフィルターで動的な権限付与・admin_initでページアクセスを権限ブロック、⑤wp super-admin addでマルチサイトのスーパー管理者を設定・is_super_admin()で判定・スーパー管理者は最小限のユーザーのみに設定の手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲