2026年5月21日

2026年5月21日

Ultimate Memberのエラーを解決する方法

はじめに

Ultimate Memberでユーザー登録フォームを送信しても「登録が完了しませんでした」と表示されてアカウントが作成されない・プロフィールページで画像をアップロードしようとすると「ファイルサイズが大きすぎます」エラーが出る・管理者が登録したカスタムフィールドがフロントエンドに表示されない・特定のユーザーロールに対してのみメニューを表示したいといった問題は、PHP設定・ファイルパーミッション・フォーム設定が原因です。

症状・原因

  • 登録フォームを送信するとエラーなくリダイレクトされるがユーザーが作成されていない
  • プロフィール画像のアップロードで「The uploaded file exceeds the upload_max_filesize」エラーが出る
  • 管理画面で追加したカスタムフィールドがフロントエンドのプロフィールページに表示されない
  • 登録承認メールが管理者に届かない

解決手順

ステップ1:Ultimate Memberの状態を確認する

# Ultimate Memberの設定確認
wp eval "
if (defined('ultimatemember_version')) {
    echo 'Ultimate Member version: ' . ultimatemember_version . PHP_EOL;
}

// UM設定を確認
echo 'Registration page: '  . get_option('um_core_page_register') . PHP_EOL;
echo 'Login page: '         . get_option('um_core_page_login') . PHP_EOL;
echo 'Profile page: '       . get_option('um_core_page_user') . PHP_EOL;
echo 'Account page: '       . get_option('um_core_page_account') . PHP_EOL;

// 登録設定
\$settings = get_option('um_settings', []);
echo 'Admin approval: '     . ((\$settings['registration']['admin_approval'] ?? false) ? 'yes' : 'no') . PHP_EOL;
echo 'Email activation: '   . ((\$settings['registration']['email_activation'] ?? false) ? 'yes' : 'no') . PHP_EOL;
echo 'Default role: '       . (\$settings['registration']['role'] ?? 'subscriber') . PHP_EOL;

// UMユーザー統計
global \$wpdb;
\$um_users = \$wpdb->get_var(
    \"SELECT COUNT(*) FROM \$wpdb->usermeta WHERE meta_key = 'um_user_roles'\"
);
echo 'UM registered users: ' . \$um_users . PHP_EOL;

// 保留中のユーザーを確認
\$pending = get_users(['meta_key' => 'um_status', 'meta_value' => 'awaiting_admin_review', 'number' => 5]);
echo 'Pending approvals: '  . count(\$pending) . PHP_EOL;
"

ステップ2:ユーザー登録をカスタマイズする

// functions.php: Ultimate Member登録設定

// ① 登録完了後にカスタム処理を実行
add_action('um_after_user_register', function(int $user_id): void {
    // デフォルトのユーザーメタを設定
    update_user_meta($user_id, 'um_profile_visibility', 'public');
    update_user_meta($user_id, '_um_last_login', current_time('timestamp'));

    // ウェルカムメールを送信
    $user = get_userdata($user_id);
    wp_mail(
        $user->user_email,
        sprintf('[%s] ご登録ありがとうございます', get_bloginfo('name')),
        sprintf("こんにちは %s さん、\n\n%s へのご登録ありがとうございます。\n\nプロフィールURL: %s",
            $user->display_name,
            get_bloginfo('name'),
            um_user_profile_url($user_id)
        )
    );

    error_log(sprintf('[UM] New user registered: #%d %s', $user_id, $user->user_email));
}, 10);

// ② 登録フォームのバリデーションをカスタマイズ
add_filter('um_registration_validate_fields', function(array $submitted_data, array $form_data): array {
    // ユーザー名に禁止ワードを含む場合は拒否
    $banned_words = ['admin', 'test', 'null', 'undefined'];
    foreach ($banned_words as $word) {
        if (str_contains(strtolower($submitted_data['user_login'] ?? ''), $word)) {
            UM()->form()->add_error('user_login', 'このユーザー名は使用できません。');
        }
    }
    return $submitted_data;
}, 10, 2);

// ③ 管理者承認後のロールを自動設定
add_action('um_after_user_approved', function(int $user_id): void {
    $user = new WP_User($user_id);
    // 登録フォームで選択した職種に応じてロールを付与
    $occupation = get_user_meta($user_id, 'occupation', true);
    if ($occupation === 'developer') {
        $user->set_role('editor');
    }
});

ステップ3:プロフィール画像アップロードを修正する

// functions.php: プロフィール画像設定

// ① アップロード可能なファイルサイズを拡大
add_filter('um_profile_photo_max_size', function(int $size): int {
    return 5 * 1024 * 1024; // 5MB(デフォルト1MB)
});

// ② 許可する画像形式を設定
add_filter('um_profile_photo_allowed_types', function(array $types): array {
    return ['image/jpeg', 'image/png', 'image/webp'];
});

// ③ アップロードディレクトリのパーミッション確認
add_action('admin_notices', function(): void {
    $upload_dir = wp_upload_dir();
    $um_dir     = $upload_dir['basedir'] . '/ultimatemember';

    if (!is_dir($um_dir)) {
        wp_mkdir_p($um_dir);
    }

    if (!is_writable($um_dir)) {
        echo '<div class="notice notice-error"><p>';
        printf('Ultimate Member: アップロードディレクトリ (%s) への書き込み権限がありません。', esc_html($um_dir));
        echo '</p></div>';
    }
});

// ④ プロフィール更新後にキャッシュをクリア
add_action('um_after_user_updated', function(int $user_id): void {
    delete_transient('um_profile_' . $user_id);
    clean_user_cache($user_id);
});

ステップ4:カスタムフィールドとロールを管理する

# カスタムフィールドとロール確認
wp eval "
// UMフォームを確認
\$forms = get_posts([
    'post_type'      => 'um_form',
    'posts_per_page' => 10,
    'post_status'    => 'publish',
]);

echo 'Total UM forms: ' . count(\$forms) . PHP_EOL;

foreach (\$forms as \$form) {
    \$mode = get_post_meta(\$form->ID, '_um_mode', true);
    printf('  Form #%d: %s | Mode: %s' . PHP_EOL,
        \$form->ID, \$form->post_title, \$mode
    );
}

// UMロールを確認
\$roles = get_option('um_roles', []);
echo 'UM roles defined: ' . count(\$roles) . PHP_EOL;

foreach (\$roles as \$role_key => \$role) {
    printf('  Role: %s | Default: %s | Can upload: %s' . PHP_EOL,
        \$role_key,
        (\$role['is_default'] ?? false) ? 'yes' : 'no',
        (\$role['can_upload_cover_picture'] ?? false) ? 'yes' : 'no'
    );
}
"

ステップ5:ロールベースのコンテンツ制限を設定する

// functions.php: ロールベース制限

// ① UMロールに基づいてメニューを制御
add_filter('wp_nav_menu_objects', function(array $items, object $args): array {
    foreach ($items as $key => $item) {
        $required_role = get_post_meta($item->ID, '_menu_item_um_role', true);
        if (empty($required_role)) continue;

        if (!is_user_logged_in()) {
            unset($items[$key]);
            continue;
        }

        // UMロールを確認
        $user_roles = get_user_meta(get_current_user_id(), 'um_user_roles', true);
        if (!in_array($required_role, (array) $user_roles, true)) {
            unset($items[$key]);
        }
    }
    return $items;
}, 10, 2);

// ② ページへのアクセスをUMロールで制限
add_action('template_redirect', function(): void {
    if (!is_page()) return;

    $restricted_role = get_post_meta(get_the_ID(), '_um_access_role', true);
    if (empty($restricted_role)) return;

    if (!is_user_logged_in()) {
        wp_redirect(um_get_core_page('login'));
        exit;
    }

    $user_roles = get_user_meta(get_current_user_id(), 'um_user_roles', true);
    if (!in_array($restricted_role, (array) $user_roles, true)) {
        wp_die('このページにアクセスする権限がありません。', 403);
    }
});

// ③ 未ログインユーザーをリダイレクト
add_action('um_before_profile_template', function(): void {
    if (!is_user_logged_in() && UM()->options()->get('require_login') === '1') {
        wp_redirect(um_get_core_page('login'));
        exit;
    }
});

注意事項

  • Ultimate Memberのプロフィール画像アップロードが失敗する場合は、php.iniupload_max_filesizepost_max_sizeも合わせて確認してください。プラグイン側のフィルターだけでは不十分でPHPレベルの制限が優先されます
  • カスタムフィールドがフロントエンドに表示されない場合は、フォームのフィールド設定で「登録フォーム」「プロフィールフォーム」それぞれに個別にフィールドを追加する必要があります。フォームを共有していない限り設定が引き継がれません
  • Ultimate Memberのページ(登録・ログイン・プロフィール)を削除・再作成すると「WooCommerce → 設定 → 詳細 → ページ設定」と同様にUM設定でページを再設定する必要があります

まとめ

Ultimate Member修復は①um_settingsオプションで承認設定・メール有効化・デフォルトロールを確認・保留中ユーザーを特定、②um_after_user_registerフックでメタ設定・ウェルカムメール送信・um_registration_validate_fieldsで禁止ユーザー名をバリデーション、③um_profile_photo_max_sizeフィルターで5MBに拡大・アップロードディレクトリのパーミッション確認・um_after_user_updatedでキャッシュクリア、④um_form投稿でフォーム一覧・um_rolesでロール設定を確認、⑤wp_nav_menu_objectsフィルターでUMロールベースのメニュー制御・template_redirectでページアクセス制限する手順で解決します。

お気軽にご相談ください

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