
こんな人におすすめ
- Ultimate MemberプラグインでChoices Callback機能を使用している方
- プロフィール画面に数値IDが表示され、ラベル名に変換されない問題で困っている方
- WordPressプラグインのフィルターシステムの仕組みを理解したい方
- PHPでのデバッグ手法やデータフローの調査方法を学びたい方
目次
- Ultimate MemberフォームのChoices Callbackフィールドとは
- 数値IDが表示される具体的な不具合症状
- フィルター関数が文字列を受け取るという原因の仕組み
- フィルター関数を修正してラベル名を表示させる方法
- 学び
- よくある質問(FAQ)
- まとめ
Ultimate MemberフォームのChoices Callbackフィールドとは
Ultimate Member(UM)プラグインのフォーム機能でChoices Callbackを使用したmultiselectフィールド(例:都道府県、興味・関心カテゴリ)を実装しました。
データベースには正しく保存されているのですが、プロフィール画面で数値ID(例: “1”、“4, 5, 7”)がそのまま表示され、ラベル名(例: “東京”、“Web開発, デザイン, マーケティング”)に変換されない不具合が発生しました。
正直なところ、この原因を特定するのに半日ほど時間がかかりました。最初は配列で渡されると思い込んでいたため、文字列変換の処理が抜けていたことに気づくのが遅れたのです。
この不具合は、Choices Callbackフィールドを使用している多くのユーザーが遭遇する可能性のある問題です。
数値IDが表示される具体的な不具合症状
- プロフィール画面での表示:
- 都道府県:
1→ 期待値:東京 - 興味・関心:
4, 5, 7→ 期待値:Web開発, デザイン, マーケティング
- 都道府県:
- データベースには配列形式で正しく保存されている
- カスタムテンプレートでは正しく変換されて表示される
- プロフィール画面でのみラベル名が表示されず、数値IDが表示される
フィルター関数が文字列を受け取るという原因の仕組み
Ultimate Memberのフィルターシステムの動作を誤解していました。
flowchart LR
A[データベース<br/>配列形式で保存] -->|配列| B[カスタムテンプレート<br/>正しく変換]
A -->|文字列変換| C[UMフィルター<br/>um_profile_field_filter_hook]
C -->|単一値: 1<br/>複数値: 4, 5, 7| D[プロフィール画面<br/>数値IDが表示される]
style A fill:#e1f5ff
style D fill:#ffe1e1
style C fill:#fff4e1
- UMのフィルター仕様:
um_profile_field_filter_hook__{$key}フィルターは、値を文字列として受け取ります- 単一値:
"1" - 複数値:
"4, 5, 7"(カンマ区切り)
- 単一値:
- 実装済みフィルター関数の問題: 配列のみを処理する実装になっており、文字列の場合は何も変換せずにそのまま返していました
// 配列でない場合は元の値を返す(UMが既に変換済みの可能性) if ( ! is_array( $value ) ) { return $value; // ← 文字列 "1" をそのまま返してしまう }
フィルター関数を修正してラベル名を表示させる方法
フィルター関数を修正して、文字列形式のデータも処理できるようにしました。
修正方法の選択肢
WordPressプラグインのカスタマイズには、主に以下の2つの方法があります:
方法1: テーマのfunctions.phpまたは独自プラグインで追加(推奨)
- ✅ プラグインアップデート時に上書きされない
- ✅ WordPressのベストプラクティスに沿っている
- ✅ テーマを変更してもコードが残る(独自プラグインの場合)
方法2: Ultimate Member本体のファイルを直接修正(非推奨)
- ❌ プラグインアップデート時に変更が消える
- ⚠️ 今回は独自のクラスファイル(
src/includes/core/class-um.php)を使用した例として紹介
推奨される実装方法
テーマのfunctions.phpまたは独自プラグインに、以下のフィルターフックを追加します:
<?php
/**
* Choices Callbackフィールドの値をラベル名に変換するフィルター
*/
add_filter( 'um_profile_field_filter_hook__user_region', 'convert_region_to_labels', 10, 2 );
add_filter( 'um_profile_field_filter_hook__user_interests', 'convert_interests_to_labels', 10, 2 );
/**
* ユーザーの地域(user_region)の値をラベル名に変換する
*
* @param string $value フィールドの値(数値IDまたはカンマ区切りの数値ID)
* @param array $data フィールドデータ
* @return string ラベル名(カンマ区切り)
*/
function convert_region_to_labels( $value, $data ) {
try {
// 値が空の場合は空文字列を返す
if ( empty( $value ) ) {
return '';
}
// 文字列の場合は配列に変換(カンマ区切り or 単一値)
if ( is_string( $value ) ) {
// カンマ区切りの場合は分割
if ( strpos( $value, ',' ) !== false ) {
$value = array_map( 'trim', explode( ',', $value ) );
} else {
// 単一値の場合は配列化
$value = [ trim( $value ) ];
}
}
// 配列でない場合はエラー
if ( ! is_array( $value ) ) {
return '';
}
// ここで各IDを対応するラベル名に変換する処理を実装
// 例: 都道府県マスターから取得、または独自の変換テーブルを使用
$region_names = [];
foreach ( $value as $region_id ) {
// 0と空文字列をスキップ
if ( empty( $region_id ) || '0' === $region_id || 0 === $region_id ) {
continue;
}
// 変換処理(例: 都道府県ID → 都道府県名)
// $region_name = get_region_name( $region_id );
// if ( $region_name ) {
// $region_names[] = $region_name;
// }
}
// 変換結果が空の場合は空文字列を返す
return ! empty( $region_names ) ? implode( ', ', $region_names ) : '';
} catch ( \Exception $e ) {
// エラーが発生した場合は空文字列を返す
return '';
}
}
/**
* ユーザーの興味・関心(user_interests)の値をラベル名に変換する
*
* @param string $value フィールドの値(数値IDまたはカンマ区切りの数値ID)
* @param array $data フィールドデータ
* @return string ラベル名(カンマ区切り)
*/
function convert_interests_to_labels( $value, $data ) {
// 上記と同様の実装
// ...
return $value;
}
修正内容
今回の不具合を修正するためのポイントは、フィルター関数が文字列形式の値も受け取れるようにすることです。
処理の流れを図解すると以下のようになります:
flowchart TD
A[値を受信] --> B{値が空?}
B -->|Yes| C[空文字を返す]
B -->|No| D{文字列?}
D -->|Yes| E{カンマを含む?}
E -->|Yes| F[カンマで分割]
E -->|No| G[配列化]
D -->|No| H{配列?}
H -->|No| C
F --> I[各IDを変換]
G --> I
H -->|Yes| I
I --> J[カンマ区切りで結合]
style C fill:#ffcccc
style J fill:#ccffcc
修正のポイント:
- 文字列入力の対応: カンマ区切りの文字列(
"4, 5, 7")を配列に分割 - 単一値の対応: 単一の文字列(
"1")も配列に変換 - エラーハンドリング: 例外処理で予期しないエラーに対処
同様の修正を convert_interests_to_labels() 関数にも適用できます。
よくある質問(FAQ)
Ultimate Memberで数値IDが表示される原因は?
フィルター関数が配列形式の値のみを想定しており、Ultimate Memberから渡される文字列形式の値(例: "1"や"4, 5, 7")を正しく処理できていないことが原因です。
Ultimate Memberのum_profile_field_filter_hook__{$key}フィルターは、値を文字列として受け取ります。単一値の場合は"1"、複数値の場合は"4, 5, 7"のようにカンマ区切りの文字列で渡されますが、実装によってはこれらを配列として処理しようとして表示されない不具合が発生します。
Choices Callbackフィールドでラベル名を表示するには?
フィルター関数を修正して、文字列形式の値も配列に変換してから処理することで解決します。
具体的な修正手順:
- 文字列形式の値を受け取った場合、カンマ区切りで分割して配列に変換
- 各IDを対応するラベル名に変換
- ラベル名をカンマ区切りで結合して返す
本記事で紹介している修正コードをそのまま適用することで、プロフィール画面で正しくラベル名が表示されるようになります。
この不具合はどのような場合に発生しますか?
この不具合は、以下の条件で発生します:
- Ultimate MemberでChoices Callback機能を使用している
- multiselect形式のカスタムフィールドを実装している
- フィルター関数
um_profile_field_filter_hook__{$key}を使用して表示をカスタマイズしている - フィルター関数が配列形式の値のみを想定している
特に、データベースには正しく保存されているのにプロフィール画面でのみ数値IDが表示される場合、この不具合の可能性が高いです。
修正後にラベル名が表示されない場合は?
修正後にラベル名が表示されない場合は、以下を確認してください:
- キャッシュをクリア: ブラウザのキャッシュ(Ctrl+F5)とWordPressのキャッシュプラグインをクリア
- フィルターフック名を確認:
um_profile_field_filter_hook__{$key}の{$key}部分が正しいフィールド名になっているか確認 - 関数が正しく呼ばれているか:
add_filter()で関数が登録されているか確認 - PHPエラーをチェック: デバッグモードを有効にしてエラーログを確認
まとめ
Ultimate MemberのChoices Callbackフィールド表示問題は、フィルターが文字列形式で値を受け取ることを正しく理解していなかったことが原因でした。
得られた効果
- プロフィール画面で数値IDの代わりにラベル名が正しく表示されるようになりました
- ユーザー体験が向上し、サポート問い合わせの削減が期待できます
- フィルター関数の実装パターンを学び、今後の開発に応用できます
学びのポイント
-
WordPressプラグインのフィルターシステムを調査する重要性
- ドキュメントだけでなく、実際のプラグインのソースコードを確認することで、フィルターが受け取る値の形式を正確に把握できました
- ドキュメントコメント内の
@paramアノテーションが重要な手がかりになります
-
型の仮定に注意
- 「配列を処理するフィルター」という先入観が原因で、文字列を処理できない実装になっていました
- フィルター関数では、複数の入力形式(配列・文字列・null等)を想定した柔軟な実装が必要です
-
データフロー全体の理解
- データベース保存時 → 配列
- UMフィルター呼び出し時 → 文字列(UMが内部で変換)
- カスタムヘルパー関数 → 配列(直接DBから取得)
この違いを理解することで、適切な実装を選択できました
今回の修正により、プロフィール画面で正しくラベル名が表示されるようになりました。
WordPressプラグインのフィルターシステムを扱う際は、実際にコードを読んで値の形式を確認することの重要性を学びました。

