はじめに
新しく作成したウィジェットエリアに配置したウィジェットを、特定の既存ウィジェットエリアに自動でコピーします。
例えば、ウィジェットの表示サンプルを複数のウィジェットエリアに登録・確認するのは手間がかかります。
そこで、一つのウィジェットエリアにだけ登録しておけば、表示条件に応じて他エリアにコピー表示されるようにすることで、作業効率を大幅に改善できます。
この記事では、この方法について説明します。
完成イメージ

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


