WordPress 開發不只需要知道 PHP 語法,還要理解 WordPress 如何用物件、查詢與模板標籤組織內容。本章把 PHP 物件導向與 WordPress 前台輸出串起來。

本章學習目標

能理解類別、物件、方法、可見性與 WordPress Loop,並安全輸出文章、摘要、分類與自訂欄位。

7.1 PHP 物件導向程式設計基礎

物件導向把資料與行為包成類別。WordPress 核心中許多重要物件,例如 WP_QueryWP_PostWP_User,都以類別表示。

class Course {
    public $title;
    public function __construct($title) { $this->title = $title; }
    public function label() { return '課程:' . $this->title; }
}

$course = new Course('WordPress 開發');
echo esc_html($course->label());

屬性與方法

屬性保存狀態,方法描述行為。若資料只應在類別內部操作,可使用 privateprotected 降低誤用風險。

建構子與依賴注入

建構子 __construct() 適合接收類別一開始就需要的資料。若某個類別依賴設定值、服務物件或外部資料,可以在建構時傳入,而不是在類別內到處讀取全域變數。

class Course_Renderer {
    private array $settings;

    public function __construct(array $settings) {
        $this->settings = $settings;
    }

    public function render_title(string $title): string {
        $tag = $this->settings['title_tag'] ?? 'h2';
        return '<' . esc_html($tag) . '>' . esc_html($title) . '</' . esc_html($tag) . '>';
    }
}

這種做法會讓類別更容易測試,也比較容易在不同外掛或主題環境中重用。

可見性與封裝

  • public:外部可以直接呼叫,通常是類別提供給其他程式使用的介面。
  • protected:只有自己與子類別可以使用,適合給繼承架構共用。
  • private:只有類別自己可以使用,適合封裝內部細節。

初學者常把所有屬性與方法都設成 public,短期方便,長期會讓外部程式過度依賴類別內部細節。能不公開的就先不公開。

7.2 PHP 物件導向程式進階

進階物件導向常見概念包含繼承、介面、命名空間與自動載入。大型外掛會用這些技巧把功能拆成較小的類別。

以類別組織外掛功能

class WP2026_Plugin {
    public function register() {
        add_action('init', [$this, 'boot']);
    }
    public function boot() {
        // 初始化外掛功能
    }
}

$plugin = new WP2026_Plugin();
$plugin->register();

這種寫法能避免全域函式過多,也方便將設定頁、前台輸出與 AJAX 分成不同類別。

命名空間避免衝突

WordPress 外掛同時載入在同一個 PHP 執行環境中,函式或類別名稱若重複會造成 fatal error。除了使用前綴,也可以用 namespace 組織程式碼。

namespace WP2026\Plugin;

class Bootstrap {
    public function register(): void {
        add_action('init', [$this, 'init']);
    }

    public function init(): void {
        // 註冊外掛功能
    }
}

若使用 namespace,呼叫 WordPress 全域函式時通常仍可直接呼叫;需要特別注意的是類別路徑、自動載入與檔案結構要一致。

單一職責原則

大型外掛不要把所有功能塞進同一個類別。比較好的拆法是讓每個類別只負責一件事:

  • Admin_Page:後台設定頁。
  • Assets:樣式與腳本載入。
  • Shortcodes:短代碼註冊與輸出。
  • Post_Types:自訂文章類型與分類法。
  • Ajax:AJAX 請求處理。

這樣未來要修改設定頁時,不會不小心影響前台短代碼或 AJAX 功能。

靜態方法的取捨

你會在許多 WordPress 範例看到 Class_Name::method 靜態方法。它寫起來方便,但若所有東西都做成 static,測試與替換依賴會變困難。簡單工具函式可以用 static;需要保存狀態或設定的功能,通常用物件實例更適合。

7.3 深入分析 WordPress 佈景主題的內容顯示

WordPress 前台內容多半由查詢結果與模板檔共同產生。The Loop 會逐篇讀取目前查詢到的文章,再用模板標籤輸出內容。

主查詢與全域 $post

當 WordPress 根據網址查詢內容後,會建立主查詢。模板標籤如 the_title()the_content() 通常依賴目前迴圈中的全域文章資料。這也是為什麼自訂查詢後要重置資料。

global $post;
echo esc_html($post->post_title);

雖然可以直接讀取 $post,但在模板中通常優先使用 WordPress 提供的模板標籤,因為它們會套用過濾器並處理常見輸出情境。

常用模板標籤

  • the_title():輸出文章標題。
  • the_permalink():輸出文章網址。
  • the_excerpt():輸出摘要。
  • the_content():輸出完整內容。
  • the_post_thumbnail():輸出精選圖片。

取得值與直接輸出

WordPress 常有一組相似函式:the_* 直接輸出,get_* 回傳值。例如 the_title() 會輸出標題,get_the_title() 會回傳標題字串。當你需要組合 HTML 或進一步處理資料時,通常應使用 get_*

$title = get_the_title();
$url = get_permalink();

echo '<a href="' . esc_url($url) . '">' . esc_html($title) . '</a>';

安全輸出與條件顯示

if (has_post_thumbnail()) {
    the_post_thumbnail('medium');
}

$subtitle = get_post_meta(get_the_ID(), 'subtitle', true);
if ($subtitle) {
    echo '<p>' . esc_html($subtitle) . '</p>';
}

在模板中加入分類與日期

文章列表常需要呈現日期、作者與分類。這些資料能幫助讀者理解內容脈絡,也能讓列表頁更完整。

<article <?php post_class('post-card'); ?>>
  <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
  <div class="post-meta">
    <time datetime="<?php echo esc_attr(get_the_date('c')); ?>">
      <?php echo esc_html(get_the_date()); ?>
    </time>
    <span><?php the_category(', '); ?></span>
  </div>
  <?php the_excerpt(); ?>
</article>

本章練習

  1. 用類別封裝一個課程標籤輸出功能。
  2. 修改文章列表,加入日期、分類、摘要與精選圖片。
  3. 新增一個自訂欄位並安全輸出。