本章開始從使用者操作進入主題開發。你會建立一個最小可啟用的 WordPress 佈景主題,理解主題必要檔案、模板載入方式,以及如何用子佈景主題安全覆寫既有主題。

本章學習目標

能建立自訂主題骨架,理解 style.css、index.php、functions.php 的角色,並能建立子佈景主題保留客製化修改。

6.1 自訂佈景主題基礎

一個最小 WordPress 主題至少需要 style.cssindex.phpstyle.css 的檔頭讓 WordPress 辨識主題,index.php 則是最基本的模板檔。

建立主題資料夾

wp-content/themes/wp2026-basic/
├── style.css
├── index.php
└── functions.php

style.css 檔頭範例:

/*
Theme Name: WP2026 Basic
Author: minhuangyuntech
Version: 1.0.0
Text Domain: wp2026-basic
*/

主題檔頭欄位說明

style.css 檔頭不是註解而已,WordPress 會讀取這些資訊來顯示主題名稱、作者與版本。常見欄位如下:

  • Theme Name:主題顯示名稱,必要欄位。
  • Author:主題作者或團隊名稱。
  • Description:主題用途說明。
  • Version:版本號,方便部署與快取更新。
  • Text Domain:多語系翻譯識別名稱,通常與主題資料夾一致。

主題資料夾名稱建議使用小寫英文、數字與連字號,例如 wp2026-basic,避免空白與特殊符號造成路徑問題。

拆分 header 與 footer

實務主題不會把所有 HTML 寫在 index.php。頁首與頁尾是全站共用區塊,應拆成 header.phpfooter.php,再用 get_header()get_footer() 載入。

<!-- header.php -->
<!doctype html>
<html <?php language_attributes(); ?>>
<head>
  <meta charset="<?php bloginfo('charset'); ?>">
  <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<header class="site-header">
  <a href="<?php echo esc_url(home_url('/')); ?>"><?php bloginfo('name'); ?></a>
</header>
<!-- footer.php -->
<footer class="site-footer">
  <p>&copy; <?php echo esc_html(date('Y')); ?></p>
</footer>
<?php wp_footer(); ?>
</body>
</html>

wp_head()wp_footer() 非常重要,WordPress 與外掛會透過它們插入樣式、腳本與必要標記。缺少這兩個函式,很多外掛功能會失效。

輸出文章列表

<?php get_header(); ?>
<main>
<?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
    <article>
      <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
      <?php the_excerpt(); ?>
    </article>
  <?php endwhile; ?>
<?php endif; ?>
</main>
<?php get_footer(); ?>

上面的範例是最基本的文章列表。實務上還需要補上「查無資料」狀態,避免頁面空白:

<?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
    <!-- 文章輸出 -->
  <?php endwhile; ?>
<?php else : ?>
  <p>目前沒有文章。</p>
<?php endif; ?>

載入樣式與腳本

不要在模板中硬寫 CSS 或 script 路徑,應透過 wp_enqueue_scripts 載入。

add_action('wp_enqueue_scripts', 'wp2026_enqueue_assets');
function wp2026_enqueue_assets() {
    wp_enqueue_style('wp2026-style', get_stylesheet_uri(), [], '1.0.0');
}

如果主題有獨立 JavaScript 檔案,可以一起註冊。最後一個參數設為 true,代表把腳本放在頁尾載入,通常對效能較友善。

wp_enqueue_script(
    'wp2026-main',
    get_template_directory_uri() . '/assets/js/main.js',
    [],
    '1.0.0',
    true
);

Template Hierarchy 入門

WordPress 會依網址與內容類型自動尋找模板檔,這套規則稱為 Template Hierarchy。常見對應如下:

  • 首頁文章列表:home.php,找不到時使用 index.php
  • 單篇文章:single.php,找不到時使用 singular.phpindex.php
  • 頁面:page.php,找不到時使用 singular.phpindex.php
  • 分類封存:category.php,找不到時使用 archive.phpindex.php

理解這套規則後,你就能知道「新增哪個檔案可以控制哪種頁面」。

6.2 子佈景主題的運用

子佈景主題 (Child Theme) 可以繼承父主題,並只覆寫需要修改的部分。這樣父主題更新時,你的客製化檔案不會被覆蓋。

建立子主題

/*
Theme Name: WP2026 Child
Template: twentytwentysix
Version: 1.0.0
*/

Template 必須填父主題資料夾名稱,而不是主題顯示名稱。

在子主題載入樣式

子主題若要載入自己的樣式,建議在子主題的 functions.php 使用 wp_enqueue_scripts。不要使用舊式 @import,因為它較不利於效能。

add_action('wp_enqueue_scripts', 'wp2026_child_enqueue_styles');
function wp2026_child_enqueue_styles() {
    wp_enqueue_style(
        'wp2026-child-style',
        get_stylesheet_uri(),
        [],
        '1.0.0'
    );
}

在子主題中,get_stylesheet_directory_uri() 指向子主題;get_template_directory_uri() 指向父主題。兩者在主題開發中很常被混淆。

覆寫模板檔案

若子主題中建立與父主題同名的模板檔,例如 single.php,WordPress 會優先使用子主題版本。這讓你可以只改需要的模板,而保留父主題其他功能。

覆寫前先確認責任範圍

如果只是改顏色或間距,用 CSS 即可;如果要改 HTML 結構,才需要覆寫模板。覆寫越多,未來父主題更新時需要檢查的範圍也越大。

何時用子主題

  • 只想微調現有主題的樣式或模板。
  • 客戶網站使用商業主題,仍需要保留更新能力。
  • 不想從零建立完整主題。

本章練習

  1. 建立一個名為 wp2026-basic 的主題並啟用。
  2. 讓首頁列出文章標題與摘要。
  3. 使用 functions.php 載入樣式。
  4. 建立一個子主題,覆寫父主題的部分樣式。