WordPress 側邊欄是小工具容器區域,主題通過註冊側邊欄定義可用區域,用戶在後台「外觀 → 小工具」拖拽放置功能模塊。兩大核心函數:
functions.php 中掛載到 widgets_init)register_sidebar( array|string $args = [] ): string|void
| 鍵名 | 類型 | 默認值 | 說明 |
|---|---|---|---|
| name | string | 'Sidebar N' | 後台顯示名稱(建議國際化 __()) |
| id | string | 'sidebar-N' | 唯一標識符(小寫、無空格),用於 dynamic_sidebar() 調用 |
| description | string | '' | 後台側邊欄面板顯示的描述文字 |
| class | string | '' | 側邊欄容器額外 CSS 類 |
| before_widget | string | ' | 每個小工具前輸出 HTML,%1$s=widget ID,%2$s=widget 類名 |
| after_widget | string | '' | 每個小工具後輸出 HTML |
| before_title | string | '' | 小工具標題前輸出 HTML |
| after_title | string | '' | 小工具標題後輸出 HTML |
成功返回側邊欄 ID,失敗返回 WP_Error(如 ID 衝突)。
function my_theme_register_sidebars() {
// 主側邊欄(右側)
register_sidebar([
'name' => __('主側邊欄', 'textdomain'),
'id' => 'sidebar-primary',
'description' => __('顯示在文章/頁面右側', 'textdomain'),
'before_widget' => '',
'before_title' => '',
'after_title' => '
',
]);
// 頁腳第一欄
register_sidebar([
'name' => __('頁腳左側', 'textdomain'),
'id' => 'footer-1',
'description' => __('頁腳左側小工具區域', 'textdomain'),
'before_widget' => '',
'before_title' => '',
'after_title' => '
',
]);
// 頁腳第二欄
register_sidebar([
'name' => __('頁腳中間', 'textdomain'),
'id' => 'footer-2',
'description' => __('頁腳中間小工具區域', 'textdomain'),
'before_widget' => '',
'before_title' => '',
'after_title' => '
',
]);
// 頁腳第三欄
register_sidebar([
'name' => __('頁腳右側', 'textdomain'),
'id' => 'footer-3',
'description' => __('頁腳右側小工具區域', 'textdomain'),
'before_widget' => '',
'before_title' => '',
'after_title' => '
',
]);
}
add_action('widgets_init', 'my_theme_register_sidebars');
get_sidebar( string $name = null ): void
$name(如 get_sidebar('left')),加載 sidebar-{$name}.php(即 sidebar-left.php)sidebar.phpwp-includes/theme-compat/sidebar.php(核心默認)// sidebar.php
<aside id="secondary" class="widget-area" role="complementary">
<?php dynamic_sidebar('sidebar-primary'); ?>
</aside>
// sidebar-left.php
<aside id="sidebar-left" class="widget-area">
<?php dynamic_sidebar('sidebar-left'); ?>
</aside>
// sidebar-right.php
<aside id="sidebar-right" class="widget-area">
<?php dynamic_sidebar('sidebar-primary'); ?>
</aside>
// 模板文件 page.php / single.php
<?php get_sidebar('left'); ?>
<main id="primary" class="content-area">...</main>
<?php get_sidebar('right'); ?>
// footer.php
<footer id="colophon" class="site-footer">
<div class="footer-widgets">
<?php dynamic_sidebar('footer-1'); ?>
<?php dynamic_sidebar('footer-2'); ?>
<?php dynamic_sidebar('footer-3'); ?>
</div>
</footer>
get_sidebar() 只是包含模板文件,真正輸出小工具的是模板內的 dynamic_sidebar():
// 判斷側邊欄是否有小工具,避免輸出空容器
if (is_active_sidebar('sidebar-primary')) {
dynamic_sidebar('sidebar-primary');
}
function my_theme_default_widgets() {
if (get_option('my_theme_widgets_initialized')) return;
$sidebars = ['sidebar-primary' => ['search-2', 'recent-posts-2', 'categories-2']];
foreach ($sidebars as $sidebar_id => $widgets) {
$sidebar = get_option('sidebars_widgets', []);
$sidebar[$sidebar_id] = $widgets;
update_option('sidebars_widgets', $sidebar);
}
update_option('my_theme_widgets_initialized', true);
}
add_action('after_switch_theme', 'my_theme_default_widgets');
function my_child_remove_sidebars() {
unregister_sidebar('sidebar-primary'); // 需知道父主題 ID
}
add_action('widgets_init', 'my_child_remove_sidebars', 11); // 優先級大於父主題
template parts 替代傳統側邊欄,但經典主題繼續沿用本機制。sidebar-primary、footer-1)before_widget 包含 id="%1$s" 和 class="widget %2$s" 以支持核心 CSS/JSbefore_title/after_title 語義化標籤(h2-h4),無障礙友好is_active_sidebar() 判斷再輸出name/description)editor-style.css 使後台小工具預覽與前端一致register_sidebar():wp-includes/widgets.phpget_sidebar():wp-includes/general-template.phpdynamic_sidebar():wp-includes/widgets.phpregister_sidebar() 定義容器,get_sidebar() 載入模板,dynamic_sidebar() 輸出小工具。掌握三者配合,即可構建靈活的佈局區域,支援用戶自定義內容模塊。現代主題開發建議:語義化 ID、無障礙標記、條件性輸出、國際化字符串。