WordPressサイトで投稿データの一括インポート・エクスポートを行いたい場面は多くあります。今回、WP Import Export Liteプラグインを導入した際に、ACF(Advanced Custom Fields)のチェックボックスフィールドがインポートに対応していないという問題に直面しました。
本記事では、この問題の原因と、カスタムタクソノミーへの移行によって解決した方法を紹介します。
問題:ACFチェックボックスがインポートできない
構成の背景
例えば、レシピサイトのカスタム投稿タイプ recipe に対して、以下のようなACFチェックボックスフィールドを設定していたとします。
- フルーツ(
fruits)— りんご、バナナ、いちご など - 調理方法(
cooking_method)— 焼く、煮る、蒸す など - 難易度(
difficulty)— 初級、中級、上級
これらはACFのチェックボックスとして定義し、1つの投稿に対して複数選択できるようにしていました。
何が問題だったか
ACFのチェックボックスフィールドは、wp_postmetaテーブルにシリアライズされた配列として保存されます。
a:2:{i:0;s:5:"apple";i:1;s:6:"banana";}WP Import Export Liteでは、このシリアライズされたデータ形式をインポート時に正しく復元できません。CSVから読み込んだ値をそのままメタデータとして保存するため、ACFが期待するシリアライズ形式と一致せず、データが壊れてしまいます。
解決策:カスタムタクソノミーへの移行
なぜタクソノミーなのか
WordPressのタクソノミー(分類)は、WP Import Export Liteが標準でサポートしています。カテゴリーやタグと同じ仕組みなので、CSVにタクソノミーのスラッグや名前を記載するだけで、インポート時に自動的に紐づけてくれます。
作成したカスタムタクソノミー
ACFチェックボックスの代わりに、以下のカスタムタクソノミーを作成しました。
| 変更前(ACFチェックボックス) | 変更後(カスタムタクソノミー) |
|---|---|
fruits(りんご、バナナ、いちご…) | fruit(カスタムタクソノミー) |
cooking_method(焼く、煮る、蒸す…) | cooking_method(カスタムタクソノミー) |
difficulty(初級、中級、上級) | difficulty(カスタムタクソノミー) |
タクソノミーとして登録すれば、各選択肢は「ターム」として管理画面から追加・編集・削除できるようになります。
テーマ側の修正
タクソノミーへ移行すると、テーマ側のデータ取得ロジックも変更が必要になります。ここでは主要な3つのパターンを紹介します。
1. 選択肢の一覧を取得する
変更前:ACFのフィールド定義から選択肢を取得
$field = get_field_object('fruits');
$choices = $field['choices'];
// => ['apple' => 'りんご', 'banana' => 'バナナ', 'strawberry' => 'いちご']変更後:タクソノミーのタームから選択肢を取得
$choices = [];
$terms = get_terms(['taxonomy' => 'fruit', 'hide_empty' => false]);
if (!is_wp_error($terms) && !empty($terms)) {
foreach ($terms as $term) {
$choices[$term->slug] = $term->name;
}
}
// => ['apple' => 'りんご', 'banana' => 'バナナ', 'strawberry' => 'いちご']返り値の形式を揃えておけば、フロント側のテンプレート変更を最小限に抑えられます。
2. 投稿に紐づくデータを表示する
変更前:ACFのget_field()で取得
$fruits = get_field('fruits'); // ['apple', 'banana']
if ($fruits && is_array($fruits)) {
echo implode('、', $fruits);
}変更後:get_the_terms()で取得
$fruits = get_the_terms(get_the_ID(), 'fruit');
if (!is_wp_error($fruits) && !empty($fruits)) {
echo esc_html(implode('、', array_map(function($term) {
return $term->name;
}, $fruits)));
}3. 検索・絞り込みクエリを変更する
変更前:meta_queryでシリアライズされた値をLIKE検索
$args['meta_query'][] = [
'key' => 'fruits',
'value' => serialize('apple'),
'compare' => 'LIKE',
];この方法はシリアライズされた文字列に対する部分一致検索なので、誤マッチの可能性もあり、インデックスも効きません。
変更後:tax_queryでタクソノミー検索
$args['tax_query'][] = [
'taxonomy' => 'fruit',
'field' => 'slug',
'terms' => ['apple', 'banana'],
'operator' => 'IN',
];tax_queryを使うことで、専用のリレーションテーブル(wp_term_relationships)を使った効率的な検索になります。
カスタムタクソノミーの登録方法
カスタムタクソノミーの登録方法は、コードで書く方法とプラグインを使う方法の2つがあります。
方法1:functions.phpにコードを記述する
functions.phpに以下のように記述してタクソノミーを登録します。
add_action('init', function () {
register_taxonomy('fruit', ['recipe'], [
'label' => 'フルーツ',
'hierarchical' => false,
'show_ui' => true,
'show_in_rest' => true,
]);
register_taxonomy('cooking_method', ['recipe'], [
'label' => '調理方法',
'hierarchical' => false,
'show_ui' => true,
'show_in_rest' => true,
]);
register_taxonomy('difficulty', ['recipe'], [
'label' => '難易度',
'hierarchical' => false,
'show_ui' => true,
'show_in_rest' => true,
]);
});方法2:Custom Post Type UIプラグインを使う
コードを書かずにGUIで登録したい場合は、Custom Post Type UI(CPT UI)プラグインが便利です。
- プラグインのインストール:管理画面の「プラグイン」→「新規追加」から「Custom Post Type UI」を検索してインストール・有効化
- タクソノミーの追加:管理画面の「CPT UI」→「タクソノミーの追加と編集」を開く
- 基本設定を入力:
- タクソノミースラッグ:
fruit - 複数形のラベル:
フルーツ - 単数形のラベル:
フルーツ - 利用する投稿タイプ:
recipe(対象のカスタム投稿タイプにチェック)
- タクソノミースラッグ:
- 設定オプション:
- 階層:
false(タグのように使う場合)またはtrue(カテゴリーのように親子関係を持たせる場合) - REST APIで表示:
true(ブロックエディターで使う場合は必須)
- 階層:
- 「タクソノミーを追加」ボタンをクリックして保存
同様の手順で cooking_method、difficulty も追加します。
CPT UIを使うメリットは、コードを書かなくてよい点と、管理画面上でタクソノミーの設定を後から簡単に変更できる点です。一方、テーマに依存しないためテーマを切り替えても設定が維持されます。
どちらの方法でも、登録後は管理画面のサイドメニューから各タクソノミーのターム(りんご、バナナ等)を追加できます。
登録後、管理画面のサイドメニューから各タクソノミーのターム(りんご、バナナ等)を追加できます。
CSVインポートの例
タクソノミーに移行後、WP Import Export LiteでインポートするCSVは以下のようになります。
title,content,fruit,cooking_method,difficulty
いちごのタルト,サクサクのタルト生地に...,strawberry,bake,intermediate
バナナスムージー,朝食にぴったりの...,banana,blend,beginner
りんごのコンポート,じっくり煮込んだ...,"apple,banana",simmer,beginner複数のタームを紐づけたい場合は、WP Import Export Liteの設定に従い、カンマ区切り(apple,banana)で記述します。区切り文字は変更可能なため、パイプ(|)などに変更するとCSV形式でも記述しやすくなります。
まとめ
| 項目 | ACFチェックボックス | カスタムタクソノミー |
|---|---|---|
| WP Import Export Lite対応 | 非対応 | 対応 |
| データ保存形式 | シリアライズ配列(postmeta) | タームリレーション(term_relationships) |
| 検索クエリ | meta_query + LIKE | tax_query + IN |
| 検索パフォーマンス | 低い(LIKE検索) | 高い(インデックス活用) |
| 選択肢の管理 | フィールド定義内(コード) | 管理画面のターム管理 |
| REST API対応 | ACF to REST APIプラグインが必要 | WordPress標準で対応 |
ACFのチェックボックスにした場合、データのインポート・エクスポートや検索パフォーマンスでは不利な面があります。WP Import Export Liteなどのプラグインでデータ移行を行う予定がある場合は、最初からカスタムタクソノミーを選択するほうが問題がおきにくいです。