WordPress 開發不只需要知道 PHP 語法,還要理解 WordPress 如何用物件、查詢與模板標籤組織內容。本章把 PHP 物件導向與 WordPress 前台輸出串起來。
能理解類別、物件、方法、可見性與 WordPress Loop,並安全輸出文章、摘要、分類與自訂欄位。
7.1 PHP 物件導向程式設計基礎
物件導向把資料與行為包成類別。WordPress 核心中許多重要物件,例如 WP_Query、WP_Post、WP_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());
屬性與方法
屬性保存狀態,方法描述行為。若資料只應在類別內部操作,可使用 private 或 protected 降低誤用風險。
建構子與依賴注入
建構子 __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>
本章練習
- 用類別封裝一個課程標籤輸出功能。
- 修改文章列表,加入日期、分類、摘要與精選圖片。
- 新增一個自訂欄位並安全輸出。