【SWELL】カスタム投稿ごとにサイドバーウィジェットを出し分ける方法

SWELLで複数の投稿タイプを運用していると、
「カスタム投稿だけに専用のカテゴリー・月別アーカイブを表示したい」
という場面があります。

この記事では、
カスタム投稿専用のウィジェットを作成して出し分ける方法を紹介します。

目次

このコードは 子テーマfunctions.php に追加してください。

親テーマの functions.php に直接記述すると、テーマのアップデート時に上書きされて消えてしまいます。

念のため、編集前にfunctions.phpのバックアップを取ることをおすすめします。

以下のコードを、子テーマの functions.php に追加します。

<?php
/**
 * SWELLカスタム投稿ウィジェット出し分け
 * 子テーマのfunctions.phpに追加してください
 */

// ============================================
// 【重要】ここを編集してください
// ============================================
define('CUSTOM_POST_TYPE', 'custompost');      // カスタム投稿タイプ名
define('CUSTOM_TAXONOMY', 'custom-category');  // カスタムタクソノミー名

// ============================================
// 1. カスタム投稿カテゴリーウィジェット
// ============================================
function custompost_categories_widget($atts) {
    // タクソノミーの存在確認
    if (!taxonomy_exists(CUSTOM_TAXONOMY)) {
        return '<!-- カスタムタクソノミーが存在しません -->';
    }

    $args = array(
        'taxonomy'   => CUSTOM_TAXONOMY,
        'title_li'   => '',
        'show_count' => false,
        'hide_empty' => false,
        'echo'       => 0,
    );

    $categories = wp_list_categories($args);

    // カテゴリーが存在しない場合
    if (empty($categories)) {
        return '';
    }

    // SWELL風HTML
    $output  = '<div class="c-widget c-listMenu widget_categories">';
    $output .= '<div class="c-widget__title -side">' . esc_html('CUSTOM') . '</div>';
    $output .= '<ul>' . wp_kses_post($categories) . '</ul>';
    $output .= '</div>';

    return $output;
}
add_shortcode('custompost_categories_widget', 'custompost_categories_widget');

// ============================================
// 2. カスタム投稿月別アーカイブウィジェット
// ============================================
function custompost_archives_widget($atts) {
    // カスタム投稿タイプの存在確認
    if (!post_type_exists(CUSTOM_POST_TYPE)) {
        return '<!-- カスタム投稿タイプが存在しません -->';
    }

    $archives = wp_get_archives(array(
        'type'            => 'monthly',
        'post_type'       => CUSTOM_POST_TYPE,
        'echo'            => 0,
        'show_post_count' => true,
    ));

    // アーカイブが存在しない場合
    if (empty($archives)) {
        return '';
    }

    $output  = '<div class="c-widget c-listMenu widget_archive">';
    $output .= '<div class="c-widget__title -side">' . esc_html('CUSTOM 月別') . '</div>';
    $output .= '<ul>' . wp_kses_post($archives) . '</ul>';
    $output .= '</div>';

    return $output;
}
add_shortcode('custompost_archives_widget', 'custompost_archives_widget');

// ============================================
// 3. ウィジェット出し分け制御
// ============================================
add_filter('sidebars_widgets', 'swell_control_sidebar_widgets', 20);

function swell_control_sidebar_widgets($sidebars_widgets) {
    // サイドバーが存在しない場合は何もしない
    if (!isset($sidebars_widgets['sidebar-1']) || empty($sidebars_widgets['sidebar-1'])) {
        return $sidebars_widgets;
    }

    // 現在の投稿タイプを取得
    $current_post_type = get_post_type();
    if ($current_post_type === false) {
        $current_post_type = 'post';
    }

    // カスタム投稿タイプのページかどうかを判定
    $is_custom_post = (
        $current_post_type === CUSTOM_POST_TYPE ||
        is_post_type_archive(CUSTOM_POST_TYPE) ||
        is_tax(CUSTOM_TAXONOMY)
    );

    // 通常投稿のページかどうかを判定
    $is_regular_post = (
        $current_post_type === 'post' ||
        is_post_type_archive('post') ||
        is_home() ||
        is_category() ||
        is_tag()
    );

    // ウィジェット設定を取得
    $widget_settings = get_option('widget_custom_html', array());

    // ウィジェットをループして制御
    foreach ($sidebars_widgets['sidebar-1'] as $key => $widget_id) {
        
        // カスタムHTMLウィジェットの場合(タイトルで判定)
        if (strpos($widget_id, 'custom_html-') === 0) {
            $widget_number = str_replace('custom_html-', '', $widget_id);

            if (isset($widget_settings[$widget_number])) {
                $title = isset($widget_settings[$widget_number]['title']) 
                    ? $widget_settings[$widget_number]['title'] 
                    : '';

                // カスタム投稿用ウィジェット('CUSTOM', 'CUSTOM 月別')を通常投稿側で非表示
                if (in_array($title, array('CUSTOM', 'CUSTOM 月別'), true) && $is_regular_post) {
                    unset($sidebars_widgets['sidebar-1'][$key]);
                    continue;
                }
            }
        }

        // WordPress標準の通常投稿ウィジェットをカスタム投稿側で非表示
        $blog_widgets = array('categories-2', 'archives-2');
        if ($is_custom_post && in_array($widget_id, $blog_widgets, true)) {
            unset($sidebars_widgets['sidebar-1'][$key]);
            continue;
        }
    }

    return $sidebars_widgets;
}

// ============================================
// 4. 管理画面でウィジェットIDを表示(便利機能)
// ============================================
add_action('admin_footer', 'show_widget_ids_in_admin');

function show_widget_ids_in_admin() {
    $screen = get_current_screen();
    
    // ウィジェット画面でのみ実行
    if ($screen && $screen->id === 'widgets') {
        ?>
        <script>
        jQuery(document).ready(function($) {
            $('.widget').each(function() {
                var widgetId = $(this).find('.widget-id').val();
                if (widgetId) {
                    $(this).find('.widget-top').append(
                        '<span style="float:right; color:#666; font-size:11px; background:#f0f0f0; padding:2px 6px; border-radius:3px;">ID: ' + widgetId + '</span>'
                    );
                }
            });
        });
        </script>
        <?php
    }
}

1・2:ショートコード作成

カスタム投稿専用のカテゴリーと月別アーカイブを表示するショートコードを作成します。

3:出し分け制御

通常投稿ページではカスタム投稿用ウィジェットを非表示、
カスタム投稿ページでは通常投稿用ウィジェットを非表示にします。

  • タイトルで判定CUSTOM, CUSTOM 月別(カスタムHTMLウィジェット)
  • ウィジェットIDで判定categories-2, archives-2(WordPress標準ウィジェット)

4:デバッグ機能(便利機能)

管理画面の「外観 > ウィジェット」ページで、ウィジェットIDを自動表示します。
ID調査の手間を省けます。

1:設定を編集

コード冒頭の部分を、自分のサイトに合わせて変更します。

define('CUSTOM_POST_TYPE', 'custompost');      // ご自身の投稿タイプ名
define('CUSTOM_TAXONOMY', 'custom-category');  // ご自身のタクソノミー名

例:ニュースサイトの場合

define('CUSTOM_POST_TYPE', 'news');
define('CUSTOM_TAXONOMY', 'news-category');

2:ウィジェットを追加

カテゴリーウィジェット

[custompost_categories_widget]

月別アーカイブウィジェット

[custompost_archives_widget]

3:動作確認

以下を確認してください:

  • 通常投稿ページ:カスタム投稿用ウィジェットが非表示
  • カスタム投稿ページ:通常投稿用ウィジェットが非表示
  • カスタム投稿用のカテゴリー&月別アーカイブをショートコードで作成
  • 通常投稿とカスタム投稿でウィジェットを出し分け
  • タイトルやIDを条件分岐させて管理

この方法を使うことで、SWELLのデザインに合わせた統一感のあるサイドバーを投稿タイプごとに出し分けることができます。

SWELLで複数の投稿タイプを運用している方におすすめの方法です。

カスタム投稿のアーカイブページを作る方法はこちらをご参照ください。

あわせて読みたい
【Custom Post Type UI】カスタム投稿のアーカイブページを表示させる方法 WordPressでコーポレートサイトなどを制作していると、「お知らせ(新着情報)」と「スタッフブログ」などを分けて管理したい場面があります。 今回は、プラグイン 「Cu...
  • 自分でやってみたけれどうまくいかない
  • やりたいことはあるけど方法がわからない

そんなときはお気軽にご相談ください。
マンツーマンでサポートいたします。

目次