WordPress

✅【実践ガイド】カスタムフィールドとカスタムタクソノミーの連携テクニック!WordPressサイトの可能性を広げよう

前回の記事では、WordPressのタームとタクソノミーについて基本から解説しました。今回は一歩進んで、カスタムフィールドカスタムタクソノミーを連携させる実践的なテクニックをご紹介します!

これらを組み合わせることで、WordPressの可能性は無限に広がります。複雑なコンテンツ構造も簡単に管理できるようになるので、ぜひ最後まで読んでマスターしてください!💪

目次[-]

📋 この記事でわかること

  • カスタムフィールドとカスタムタクソノミーを連携させるメリット
  • Advanced Custom Fields(ACF)プラグインの基本と設定方法
  • タクソノミーにカスタムフィールドを追加する方法
  • タクソノミーのフィールド値を投稿内で表示する方法
  • カスタムフィールドでタクソノミーを選択する方法
  • 実践的な連携例と活用シナリオ

カスタムフィールドとカスタムタクソノミーの連携がもたらすメリット🌟

WordPressでより柔軟なコンテンツ管理を実現するには、カスタムフィールドとカスタムタクソノミーの連携が非常に効果的です。

🔷 連携のメリット

メリット説明
データの構造化関連性のあるコンテンツを論理的に整理できる
高度なフィルタリング複数の条件での検索やフィルタリングが可能になる
UI/UXの向上直感的な管理画面で編集者の作業効率が上がる
SEO対策の強化構造化データによって検索エンジンの理解度が向上
拡張性の確保サイトの成長に合わせて柔軟にコンテンツ構造を変更できる

🔷 連携の具体例

例えば、以下のような連携が可能です:

  1. レシピサイト:料理カテゴリー(タクソノミー)ごとに異なる背景色や画像(カスタムフィールド)を設定
  2. 不動産サイト:エリア(タクソノミー)ごとに担当者情報や地図(カスタムフィールド)を表示
  3. ECサイト:商品カテゴリー(タクソノミー)に説明文やアイコン(カスタムフィールド)を追加

Advanced Custom Fields(ACF)プラグインの基本🔧

カスタムフィールドとタクソノミーを連携させる上で最も便利なのが、Advanced Custom Fields(ACF)プラグインです。無料版でも多くの機能が利用できますが、さらに高度な機能を使うにはProバージョンがおすすめです。

🔷 ACFのインストール手順

  1. WordPressの管理画面から「プラグイン」→「新規追加」を選択
  2. 検索窓に「Advanced Custom Fields」と入力
  3. 「今すぐインストール」→「有効化」をクリック

🔷 ACFの主な機能

機能説明
フィールドグループ関連するフィールドをまとめて管理できる
表示条件の設定特定の条件でのみフィールドを表示できる
多様なフィールドタイプテキスト、画像、ファイル、リレーションシップなど多彩な種類
タクソノミー連携タクソノミーとの連携が簡単
カスタム位置規則投稿、ページ、タクソノミーなど表示場所を細かく指定可能

タクソノミーにカスタムフィールドを追加する方法👨‍💻

タクソノミーのターム(カテゴリーやタグなど)に追加情報を持たせたい場合、ACFを使ってカスタムフィールドを追加できます。

🔷 タクソノミーにフィールドを追加する手順

  1. ACF管理画面から「フィールドグループを追加」をクリック
  2. フィールドグループの名前を設定(例:「カテゴリー追加情報」)
  3. 必要なフィールドを追加(例:「カテゴリーの色」「カテゴリーの画像」など)
  4. 表示条件を設定:「タクソノミーターム」→「次と等しい」→「カテゴリー」
  5. 「公開」をクリックして設定を保存

これで「カテゴリー」の編集画面に新しいフィールドが追加されます!

// 表示条件の設定例
[
    [
        'param' => 'taxonomy',
        'operator' => '==',
        'value' => 'category',
    ],
]

🔷 カスタムタクソノミーにフィールドを追加する場合

カスタムタクソノミーにフィールドを追加する場合も同様の手順で、表示条件の「value」に自分のカスタムタクソノミーのスラッグを指定します。

// カスタムタクソノミー用の表示条件設定例
[
    [
        'param' => 'taxonomy',
        'operator' => '==',
        'value' => 'cooking_time', // カスタムタクソノミーのスラッグ
    ],
]

タクソノミーのフィールド値を取得・表示する方法📋

タクソノミーに追加したカスタムフィールドの値を取得して表示する方法を見ていきましょう。

🔷 タクソノミーアーカイブページでの表示

タクソノミーのアーカイブページ(category.php、taxonomy-{taxonomy}.phpなど)では、以下のようにして値を取得できます:

<?php
// 現在のタクソノミータームを取得
$term = get_queried_object();

// カスタムフィールドの値を取得
$term_color = get_field('category_color', $term);
$term_image = get_field('category_image', $term);
?>

<!-- 値の表示例 -->
<div class="category-header" style="background-color: <?php echo esc_attr($term_color); ?>">
    <h1><?php echo $term->name; ?></h1>
    <?php if($term_image): ?>
        <img src="<?php echo esc_url($term_image['url']); ?>" alt="<?php echo esc_attr($term->name); ?>">
    <?php endif; ?>
</div>

🔷 投稿の詳細ページでタクソノミーのフィールド値を表示

投稿ページ(single.php)でその投稿に紐づいたタクソノミーのカスタムフィールド値を表示する場合:

<?php
// 投稿に紐づくタームを取得
$terms = get_the_terms(get_the_ID(), 'category'); // または 'cooking_time' などのカスタムタクソノミー

if ($terms && !is_wp_error($terms)) {
    // 最初のタームを使用(複数ある場合)
    $term = array_shift($terms);
    
    // タームのカスタムフィールド値を取得
    $term_color = get_field('category_color', $term);
    $term_description = get_field('category_description', $term);
    
    // 値の表示
    echo '<div class="category-info" style="border-color: ' . esc_attr($term_color) . ';">';
    echo '<h3>' . $term->name . '</h3>';
    if ($term_description) {
        echo '<p>' . esc_html($term_description) . '</p>';
    }
    echo '</div>';
}
?>

🔷 複数のタームがある場合の処理

投稿が複数のタームに属している場合、それぞれのタームのフィールド値を取得する方法:

<?php
$terms = get_the_terms(get_the_ID(), 'category');

if ($terms && !is_wp_error($terms)) {
    echo '<div class="categories-container">';
    
    foreach ($terms as $term) {
        $term_color = get_field('category_color', $term);
        $term_icon = get_field('category_icon', $term);
        
        echo '<div class="category-badge" style="background-color: ' . esc_attr($term_color) . ';">';
        if ($term_icon) {
            echo '<img src="' . esc_url($term_icon['url']) . '" alt="" class="category-icon">';
        }
        echo $term->name;
        echo '</div>';
    }
    
    echo '</div>';
}
?>

カスタムフィールドでタクソノミーを選択する方法🔄

ACFには「タクソノミー」フィールドタイプがあり、投稿やページにタクソノミータームを選択するためのフィールドを追加できます。

🔷 タクソノミーフィールドの設定

ACFのフィールドグループに「タクソノミー」フィールドを追加する際の主な設定:

設定項目説明
タクソノミー使用するタクソノミー(カテゴリー、タグ、カスタムタクソノミーなど)
表示形式チェックボックス、ラジオボタン、セレクトボックスなど
タームの読み込み既存のタームを読み込むか、新しいタームを作成できるようにするか
タームの保存選択したタームを通常のタクソノミー関連付けとしても保存するか
フィルター表示するタームを制限するかどうか

🔷 タクソノミーフィールドの使用例

<?php
// タクソノミーフィールドの値を取得
$selected_terms = get_field('product_categories');

// 値があるか確認
if ($selected_terms) {
    echo '<div class="selected-categories">';
    echo '<h4>関連カテゴリー:</h4>';
    echo '<ul>';
    
    foreach ($selected_terms as $term) {
        // タームのリンクを表示
        echo '<li><a href="' . get_term_link($term) . '">' . $term->name . '</a></li>';
    }
    
    echo '</ul>';
    echo '</div>';
}
?>

🔷 「タームの保存」設定の違い

ACFのタクソノミーフィールドには「タームの保存」という重要な設定があります:

設定動作使用ケース
有効選択したタームが通常のWordPressタクソノミー関連付けにも保存される標準的なタクソノミー機能を保持したい場合
無効選択したタームがカスタムフィールドの値としてのみ保存される関連項目の表示だけが目的で、アーカイブページなどに影響させたくない場合

実践的な連携パターンと応用例💡

ここでは、カスタムフィールドとタクソノミーを連携させる実践的なパターンをいくつか紹介します。

🔷 パターン1:タクソノミーの見た目をカスタマイズ

カテゴリーやタグなどのタクソノミーに視覚的な要素を追加して、ユーザー体験を向上させる方法です。

実装手順:

  1. タクソノミーに「色」や「アイコン」のフィールドを追加
  2. アーカイブページや投稿一覧でそれらの値を使用してスタイリング

具体例(コード):

<?php
// sidebar.phpなどでのカテゴリー一覧表示
$categories = get_categories();

if ($categories) {
    echo '<div class="styled-categories">';
    
    foreach ($categories as $category) {
        // カテゴリーのカスタムフィールド値を取得
        $cat_color = get_field('category_color', 'category_' . $category->term_id) ?: '#eeeeee';
        $cat_icon = get_field('category_icon', 'category_' . $category->term_id);
        
        echo '<a href="' . get_term_link($category) . '" class="category-item" style="border-color: ' . esc_attr($cat_color) . ';">';
        
        if ($cat_icon) {
            echo '<span class="icon" style="background-color: ' . esc_attr($cat_color) . ';">';
            echo '<img src="' . esc_url($cat_icon['url']) . '" alt="">';
            echo '</span>';
        }
        
        echo $category->name . ' <span class="count">(' . $category->count . ')</span>';
        echo '</a>';
    }
    
    echo '</div>';
}
?>

🔷 パターン2:タクソノミーベースのコンテンツフィルタリング

カスタムフィールドとタクソノミーを組み合わせて、高度なフィルタリングシステムを構築する方法です。

実装例(レシピサイト):

  1. 「調理時間」「調理方法」「難易度」などのカスタムタクソノミーを作成
  2. 「材料」「カロリー」「準備時間」などのカスタムフィールドを追加
  3. タクソノミーとカスタムフィールドの値を組み合わせてフィルタリング機能を実装

フィルタリング用のクエリ例:

<?php
// フィルタリング条件を取得(GETパラメータから)
$cooking_time = isset($_GET['cooking_time']) ? sanitize_text_field($_GET['cooking_time']) : '';
$cooking_method = isset($_GET['cooking_method']) ? sanitize_text_field($_GET['cooking_method']) : '';
$min_calories = isset($_GET['min_calories']) ? intval($_GET['min_calories']) : 0;
$max_calories = isset($_GET['max_calories']) ? intval($_GET['max_calories']) : 1000;

// クエリ引数の構築
$args = array(
    'post_type' => 'recipe',
    'posts_per_page' => 12,
    'tax_query' => array(),
    'meta_query' => array()
);

// タクソノミーによるフィルタリング
if (!empty($cooking_time)) {
    $args['tax_query'][] = array(
        'taxonomy' => 'cooking_time',
        'field' => 'slug',
        'terms' => $cooking_time
    );
}

if (!empty($cooking_method)) {
    $args['tax_query'][] = array(
        'taxonomy' => 'cooking_method',
        'field' => 'slug',
        'terms' => $cooking_method
    );
}

// カスタムフィールドによるフィルタリング
if ($min_calories > 0 || $max_calories < 1000) {
    $args['meta_query'][] = array(
        'key' => 'calories',
        'value' => array($min_calories, $max_calories),
        'type' => 'NUMERIC',
        'compare' => 'BETWEEN'
    );
}

// クエリの実行
$recipes_query = new WP_Query($args);

// 結果の表示
if ($recipes_query->have_posts()) {
    while ($recipes_query->have_posts()) {
        $recipes_query->the_post();
        // レシピの表示コード
    }
} else {
    echo '条件に一致するレシピが見つかりませんでした。';
}
wp_reset_postdata();
?>

🔷 パターン3:関連コンテンツの表示

タクソノミーとカスタムフィールドを活用して、関連コンテンツを効果的に表示する方法です。

具体例(ブログサイト):

  1. 記事に「関連記事」のカスタムフィールド(リレーションシップタイプ)を追加
  2. 同じカテゴリーの記事から、カスタムフィールドで関連付けられた記事を優先的に表示
<?php
// 現在の投稿ID
$current_post_id = get_the_ID();

// 手動で設定された関連記事を取得
$manual_related_posts = get_field('related_posts');

// 現在の投稿のカテゴリーを取得
$categories = get_the_category();
$category_ids = array();
foreach ($categories as $category) {
    $category_ids[] = $category->term_id;
}

// 関連記事が手動で設定されているか確認
if ($manual_related_posts) {
    // 手動で設定された関連記事を表示
    echo '<div class="related-posts manual">';
    echo '<h3>関連記事</h3>';
    echo '<div class="posts-grid">';
    
    foreach ($manual_related_posts as $related_post) {
        // 関連記事の表示コード
        echo '<div class="post-card">';
        echo '<a href="' . get_permalink($related_post->ID) . '">';
        if (has_post_thumbnail($related_post->ID)) {
            echo get_the_post_thumbnail($related_post->ID, 'thumbnail');
        }
        echo '<h4>' . get_the_title($related_post->ID) . '</h4>';
        echo '</a>';
        echo '</div>';
    }
    
    echo '</div>';
    echo '</div>';
} else {
    // 手動設定がない場合、同じカテゴリーの記事を自動で取得
    $args = array(
        'category__in' => $category_ids,
        'post__not_in' => array($current_post_id),
        'posts_per_page' => 3,
        'orderby' => 'date',
        'order' => 'DESC'
    );
    
    $related_query = new WP_Query($args);
    
    if ($related_query->have_posts()) {
        echo '<div class="related-posts auto">';
        echo '<h3>同じカテゴリーの記事</h3>';
        echo '<div class="posts-grid">';
        
        while ($related_query->have_posts()) {
            $related_query->the_post();
            // 関連記事の表示コード
            echo '<div class="post-card">';
            echo '<a href="' . get_permalink() . '">';
            if (has_post_thumbnail()) {
                the_post_thumbnail('thumbnail');
            }
            echo '<h4>' . get_the_title() . '</h4>';
            echo '</a>';
            echo '</div>';
        }
        
        echo '</div>';
        echo '</div>';
        
        wp_reset_postdata();
    }
}
?>

トラブルシューティングと注意点⚠️

カスタムフィールドとタクソノミーを連携させる際によくある問題と解決策を紹介します。

🔷 タクソノミーフィールド値の取得ができない

問題get_field() でタクソノミーのフィールド値が取得できない

解決策:タクソノミーのフィールド値を取得する場合、フォーマットに注意が必要です。以下の形式で指定します:

// カテゴリーの場合
$value = get_field('field_name', 'category_' . $term_id);

// カスタムタクソノミーの場合
$value = get_field('field_name', 'taxonomy_name_' . $term_id);

// あるいは、タームオブジェクトを使用する場合
$value = get_field('field_name', $term);

🔷 「タームの保存」設定による違い

問題:タクソノミーフィールドで選択したタームがWordPressの標準機能に反映されない

解決策:ACFのタクソノミーフィールド設定で「タームの保存」オプションが有効になっているか確認してください。これが無効だと、選択したタームはカスタムフィールドの値としてのみ保存され、WordPressのタクソノミー関連付けには反映されません。

🔷 パフォーマンスの最適化

カスタムフィールドとタクソノミーを多用するとクエリが増え、パフォーマンスが低下する可能性があります。以下の点に注意しましょう:

  1. 不要なクエリを減らすために、ループ内での get_field() の使用を最小限に
  2. トランジェントAPIを使用してデータをキャッシュ
  3. 複雑なクエリはカスタムSQLを検討
// キャッシュの例
$cache_key = 'featured_categories_' . md5(serialize($args));
$categories_data = get_transient($cache_key);

if (false === $categories_data) {
    $categories = get_categories($args);
    $categories_data = array();
    
    foreach ($categories as $category) {
        $categories_data[] = array(
            'id' => $category->term_id,
            'name' => $category->name,
            'link' => get_term_link($category),
            'color' => get_field('category_color', 'category_' . $category->term_id),
            'icon' => get_field('category_icon', 'category_' . $category->term_id)
        );
    }
    
    set_transient($cache_key, $categories_data, HOUR_IN_SECONDS);
}

// キャッシュしたデータを使用
foreach ($categories_data as $category) {
    // 表示コード
}

まとめ:カスタムフィールドとタクソノミーの連携でWordPressの可能性を広げよう!🚀

この記事では、カスタムフィールドとカスタムタクソノミーを連携させる方法について詳しく解説しました。

  • タクソノミーにカスタムフィールドを追加すれば、カテゴリーやタグをよりリッチな表現で活用できます
  • カスタムフィールドでタクソノミーを選択すれば、柔軟なコンテンツ関連付けが可能になります
  • これらを組み合わせることで、WordPressの標準機能では実現できない高度なコンテンツ構造を構築できます

ACFを活用すれば、コードをほとんど書かずにこれらの機能を実装できます。初心者から中級者、そして上級者まで、WordPressサイトの可能性を広げるためのスキルとして、ぜひマスターしてみてください!

次回は「ACFブロックを使ったカスタムGutenbergブロックの作り方」について解説する予定です。お楽しみに!


参考リンク

hisa

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA