WP Import Export LiteでACFチェックボックスがインポートできない問題と、タクソノミーへの移行で解決した話

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)プラグインが便利です。

  1. プラグインのインストール:管理画面の「プラグイン」→「新規追加」から「Custom Post Type UI」を検索してインストール・有効化
  2. タクソノミーの追加:管理画面の「CPT UI」→「タクソノミーの追加と編集」を開く
  3. 基本設定を入力
    • タクソノミースラッグfruit
    • 複数形のラベルフルーツ
    • 単数形のラベルフルーツ
    • 利用する投稿タイプrecipe(対象のカスタム投稿タイプにチェック)
  4. 設定オプション
    • 階層false(タグのように使う場合)または true(カテゴリーのように親子関係を持たせる場合)
    • REST APIで表示true(ブロックエディターで使う場合は必須)
  5. 「タクソノミーを追加」ボタンをクリックして保存

同様の手順で cooking_methoddifficulty も追加します。

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 + LIKEtax_query + IN
検索パフォーマンス低い(LIKE検索)高い(インデックス活用)
選択肢の管理フィールド定義内(コード)管理画面のターム管理
REST API対応ACF to REST APIプラグインが必要WordPress標準で対応

ACFのチェックボックスにした場合、データのインポート・エクスポートや検索パフォーマンスでは不利な面があります。WP Import Export Liteなどのプラグインでデータ移行を行う予定がある場合は、最初からカスタムタクソノミーを選択するほうが問題がおきにくいです。

次の記事 » 開発会社が廃業・連絡不通に。Webシステムの引き継ぎで最初にすべきこと
ブログ一覧に戻る