【WordPress】WP-CLIでカスタムタクソノミーのカテゴリを自動登録・同期する方法

WordPressのカスタムタクソノミーにカテゴリを追加する場合、通常は管理画面で手作業が必要です。
しかし、WP-CLIを利用すると、コマンド1つで登録・更新・削除を自動化できます。
この記事では、「custom_category」タクソノミーに複数カテゴリを一括登録する方法を解説します。


1. なぜWP-CLIでカテゴリ管理するのか?

  • 本番・ステージングなど複数環境で同じカテゴリ構成を簡単に同期
  • カテゴリに付随するメタ情報(カラーコード、CSSクラス、順序)も同時設定可能
  • コード管理で再現性と保守性が向上

2. 実装の全体像

  • mu-plugins にコマンド登録ファイルを置く
  • wp-cliディレクトリに個別の処理ファイルを作成
  • WP-CLIでコマンドを実行(オプションあり)

3. ディレクトリ構成

wp-content/
├── mu-plugins/
│   └── wp-cli-commands.php
└── wp-cli/
    └── custom-categories.php

4. コード実装

4-1. mu-plugins/wp-cli-commands.php

<?php
/**
 * WP-CLI コマンドを一括登録
 */
if (defined('WP_CLI') && WP_CLI) {
    require_once WP_CONTENT_DIR . '/wp-cli/custom-categories.php';
}

4-2. wp-cli/custom-categories.php

<?php
class CustomCategoriesCommand {
    /**
     * カスタムタクソノミー「custom_category」にカテゴリを登録・同期
     *
     * ## OPTIONS
     * [--dry-run] 実際に変更せずシミュレーション
     * [--delete-missing] 定義にないカテゴリを削除
     *
     * ## EXAMPLES
     * wp custom-categories sync
     * wp custom-categories sync --dry-run
     * wp custom-categories sync --delete-missing
     */
    public function sync($args, $assoc_args) {
        $dry_run = isset($assoc_args['dry-run']);
        $delete_missing = isset($assoc_args['delete-missing']);

        // 登録するカテゴリ(ダミー)
        $categories = [
            ['name'=>'ニュース','slug'=>'news','color'=>'#ff0000','class'=>'tab-red','order'=>1],
            ['name'=>'お知らせ','slug'=>'notice','color'=>'#00ff00','class'=>'tab-green','order'=>2],
            ['name'=>'イベント','slug'=>'event','color'=>'#0000ff','class'=>'tab-blue','order'=>3],
            ['name'=>'特集','slug'=>'feature','color'=>'#ffff00','class'=>'tab-yellow','order'=>4],
            ['name'=>'コラム','slug'=>'column','color'=>'#800080','class'=>'tab-purple','order'=>5],
        ];

        // 既存ターム取得
        $existing_terms = get_terms(['taxonomy'=>'custom_category','hide_empty'=>false]);
        $existing_slugs = [];
        foreach ($existing_terms as $term) {
            $existing_slugs[$term->slug] = $term->term_id;
        }

        // 追加・更新処理
        foreach ($categories as $cat) {
            if (isset($existing_slugs[$cat['slug']])) {
                $term_id = $existing_slugs[$cat['slug']];
                if ($dry_run) {
                    WP_CLI::log("[DRY-RUN] Update: {$cat['name']} ({$cat['slug']})");
                } else {
                    update_term_meta($term_id,'color_code',$cat['color']);
                    update_term_meta($term_id,'class_name',$cat['class']);
                    update_term_meta($term_id,'order',$cat['order']);
                    WP_CLI::log("Updated: {$cat['name']} ({$cat['slug']})");
                }
            } else {
                if ($dry_run) {
                    WP_CLI::log("[DRY-RUN] Add: {$cat['name']} ({$cat['slug']})");
                } else {
                    $result = wp_insert_term($cat['name'],'custom_category',['slug'=>$cat['slug']]);
                    if (!is_wp_error($result)) {
                        $term_id = $result['term_id'];
                        update_term_meta($term_id,'color_code',$cat['color']);
                        update_term_meta($term_id,'class_name',$cat['class']);
                        update_term_meta($term_id,'order',$cat['order']);
                        WP_CLI::log("Added: {$cat['name']} ({$cat['slug']})");
                    }
                }
            }
        }

        // 不要カテゴリ削除
        if ($delete_missing) {
            foreach ($existing_slugs as $slug=>$term_id) {
                if (!array_filter($categories, fn($c)=>$c['slug']===$slug)) {
                    $dry_run
                        ? WP_CLI::log("[DRY-RUN] Delete: {$slug}")
                        : (wp_delete_term($term_id,'custom_category') && WP_CLI::log("Deleted: {$slug}"));
                }
            }
        }

        $dry_run
            ? WP_CLI::success('Dry-run completed. No changes were made.')
            : WP_CLI::success('カテゴリの登録・更新・削除が完了しました。');
    }
}
WP_CLI::add_command('custom-categories', 'CustomCategoriesCommand');

5. 実行方法

通常同期

wp custom-categories sync

シミュレーション(DB変更なし)

wp custom-categories sync --dry-run

不要カテゴリ削除

wp custom-categories sync --delete-missing

削除も含めてシミュレーション

wp custom-categories sync --dry-run --delete-missing

6. 実行結果(例)

[DRY-RUN] Update: ニュース (news)
[DRY-RUN] Add: 新しいカテゴリ (new-category)
[DRY-RUN] Delete: old-category
Success: Dry-run completed. No changes were made.

7. まとめ

WP-CLIを活用すれば、WordPressのカスタムタクソノミー管理をコードで完全制御できます。
今回の仕組みは、複数環境間でカテゴリ構成を同期する際や、カラーコードやCSSクラスなどの付加情報を一括設定したい場合に特に有効です。

コメント

タイトルとURLをコピーしました