既存ウィジェットエリアにウィジェットをコピーする方法

Cocoonカスタマイズ集
この記事は約7分で読めます。
記事内に広告が含まれています。

はじめに

新しく作成したウィジェットエリアに配置したウィジェットを、特定の既存ウィジェットエリアに自動でコピーします。

例えば、ウィジェットの表示サンプルを複数のウィジェットエリアに登録・確認するのは手間がかかります。

そこで、一つのウィジェットエリアにだけ登録しておけば、表示条件に応じて他エリアにコピー表示されるようにすることで、作業効率を大幅に改善できます。

この記事では、この方法について説明します。

完成イメージ

実装手順

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

新設したウィジェットエリア「サンプル用」のウィジェットを、条件に応じ各ウィジェットエリアにコピーします。

// ウィジェットエリアを追加
add_action('widgets_init', function () {
  register_sidebar([
    'name'        => 'サンプル用',
    'id'          => 'widget_sample',
    'description' => 'コピー元のウィジェットです。',
  ]);
});


// ウィジェットエリアの構成を変更
add_filter('sidebars_widgets', function ($sidebars_widgets) {
  if (is_admin()) {
    return $sidebars_widgets;
  }

  // 共通ウィジェットを取得
  $source_widgets = $sidebars_widgets['widget_sample'] ?? [];

  // コピー先と表示条件を設定
  $targets = [
    'sidebar'                  => is_single(9478),
    'single-content-top'       => is_single(9467),
    'above-single-sns-buttons' => is_single(9449),
    'below-single-sns-buttons' => is_single(16255),
    'content-bottom'           => is_single(9462),
    'footer-right'             => is_single(8535),
    'index-bottom'             => is_category(45),
  ];

  foreach ($targets as $target_id => $condition) {
    if (!$condition) {
      continue;
    }

    $sidebars_widgets[$target_id] = array_merge(
      $sidebars_widgets[$target_id] ?? [],
      $source_widgets
    );
  }

  return $sidebars_widgets;
});

参考:Cocoonのウィジェットエリアのインデックス名

表1に、ウィジェットエリアのインデックス名一覧を示します。

インデックス名一覧
ウィジェットエリアインデックス名
サイドバーsidebar
サイドバースクロール追従sidebar-scroll
メインカラムスクロール追従main-scroll
投稿タイトル上above-single-content-title
投稿タイトル下below-single-content-title
投稿本文上single-content-top
投稿本文中single-content-middle
投稿本文下single-content-bottom
投稿SNSボタン上above-single-sns-buttons
投稿SNSボタン下below-single-sns-buttons
投稿関連記事上above-single-related-entries
投稿関連記事下below-single-related-entries
投稿コメント上above-single-comment-aria
投稿コメント下below-single-comment-form
固定ページタイトル上above-page-content-title
固定ページタイトル下below-page-content-title
固定ページ本文上page-content-top
固定ページ本文中page-content-middle
固定ページ本文下page-content-bottom
固定ページSNSボタン上above-page-sns-buttons
固定ページSNSボタン下below-page-sns-buttons
インデックスリストトップindex-top
インデックスリストミドルindex-middle
インデックスリストボトムindex-bottom
コンテンツ上部content-top
コンテンツ下部content-bottom
フッター左footer-left
フッター中footer-center
フッター右footer-right
フッター(モバイル用)footer-mobile
404ページ404-page

参考:サイドバーの既存ウィジェットを完全に無効化し、独自コンテンツへ差し替える方法

スキンなどを提供する際、「既存のサイドバーウィジェットは一切出力させず、特定の固定パーツへ完全に差し替えたい」というケースがあります。

管理画面の登録データを破棄することなく、フックのみを使ってウィジェットエリア「サイドバー」を差し替えます。

実装手順

以下にコードをfunctions.phpに追加します。

// 「sidebar」の有効状態を取得・変更
add_filter('is_active_sidebar', function ($is_active, $index) {
  // 「sidebar」以外・管理画面・カスタマイズ画面は処理対象外
  if ($index !== 'sidebar' || is_admin() || is_customize_preview()) {
    return $is_active;
  }

  // 「sidebar」を有効として設定
  return true;
}, 10, 2);


// サイドバーのウィジェットを取得・置換
add_filter('sidebars_widgets', function ($sidebars_widgets) {
  if (is_admin()) {
    return $sidebars_widgets;
  }

  // ウィジェットエリア「サイドバー」を空に設定
  if (isset($sidebars_widgets['sidebar'])) {
    $sidebars_widgets['sidebar'] = [];
  }

  return $sidebars_widgets;
}, 10);


// ウィジェットエリア「サイドバー」の表示前に独自コンテンツを設定
add_action('dynamic_sidebar_before', function ($index) {
  // 「sidebar」以外・管理画面は処理対象外
  if ($index !== 'sidebar' || is_admin()) {
    return;
  }

  // 独自コンテンツを出力
  ?>
  <div class="my-custom-sidebar-content">
    <p>ここに独自のコンテンツを表示します。</p>
  </div>
  <?php
});

処理の流れと仕組み

WordPressの標準的なサイドバー描画プロセスに割り込む形で、以下のステップ順に処理が進みます。

  • ラベル
    is_active_sidebar フィルター

    テーマ側の判定に対し、強制定期にtrueを返してdynamic_sidebar()の実行を起動させる。

  • ラベル
    dynamic_sidebar() が起動

    WordPressのサイドバー描画関数が開始される。

  • ラベル
    sidebars_widgets() フィルター

    描画対象のウィジェット配列データを空配列に書き換える。

  • ラベル
    dynamic_sidebar_before() アクション

    サイドバー枠の中に、自分自身で定義した独自の HTML / パーツを出力する。

  • ラベル
    ウィジェット描画ループ

    配列が空なため、既存ウィジェットの出力処理は0件で通過する。

さいごに

今回紹介した方法を使えば、新しく作成したウィジェットエリアに登録したウィジェットを、特定の条件に応じて既存のエリアへ自動でコピーできるようになります。
この手法を活用することで、ウィジェットの表示確認や設定の手間を省き、作業効率を大幅に向上させることができます。

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