前言
WordPress 開發中,取得單篇文章物件與產生分類頁連結是高頻需求。get_post() 提供靈活的輸出格式;get_category_link() 配合多種查詢方式(ID、slug、名稱)能精準取得分類 URL。本文完整整理參數、回傳值、實戰範例與常見陷阱。
get_post() — 取得文章物件
函數原型
get_post( $post = null, $output = OBJECT, $filter = 'raw' )
參數說明
| 參數 | 型別 | 預設 | 說明 |
| $post | int|WP_Post|null | null(當前迴圈文章) | 文章 ID 或 WP_Post 物件 |
| $output | string | OBJECT | OBJECT / ARRAY_A / ARRAY_N |
| $filter | string | 'raw' | 資料過濾模式,參考 sanitize_post_field() |
回傳值
- 成功:WP_Post 物件 / 關聯陣列 / 數值陣列
- 失敗:
null
基本範例
// 1. 依 ID 取得物件(最常用)
$post = get_post( 7 );
echo $post->post_title;
echo $post->post_content;
echo $post->post_date;
// 2. 取得關聯陣列(方便直接 foreach 或 json_encode)
$postArr = get_post( 7, ARRAY_A );
echo $postArr['post_title'];
// 3. 在主迴圈中取得當前文章(通常直接用 $post 或 get_the_ID())
// 但可用於子迴圈或 WP_Query 迴圈外部
global $post;
$current = get_post(); // 等同於 $post
WP_Post 物件常用屬性速查
| 屬性 | 說明 |
| ID | 文章 ID |
| post_author | 作者 ID |
| post_date / post_date_gmt | 發布時間(本地/UTC) |
| post_content | 內容(未套用 the_content filter) |
| post_title | 標題 |
| post_excerpt | 摘要 |
| post_status | 狀態:publish/draft/pending/private 等 |
| comment_status | open/closed |
| post_password | 密碼保護時的密碼 |
| post_name | Slug(別名) |
| post_modified | 最後修改時間 |
| post_parent | 父文章 ID(頁面層級、附件關聯) |
| post_type | post/page/attachment/自訂類型 |
| menu_order | 排序順序 |
進階用法:取得自訂欄位
$post = get_post( 123 );
$meta = get_post_meta( $post->ID ); // 取得所有自訂欄位
$price = get_post_meta( $post->ID, 'price', true ); // 單一欄位
get_category_link() — 取得分類頁連結
函數原型
get_category_link( $category )
$category:分類 ID (int) 或分類物件 (WP_Term)
- 回傳:分類頁完整 URL (string);找不到回傳空字串
各種查詢方式取得分類連結
1. 已知分類 ID
$url = get_category_link( 23 );
2. 已知分類別名
$term = get_category_by_slug( 'news' );
if ( $term ) {
$url = get_category_link( $term );
}
3. 已知分類名稱
$catId = get_cat_ID( '最新消息' ); // 依名稱取得 ID
if ( $catId ) {
$url = get_category_link( $catId );
}
4. 在迴圈中取得當前文章的第一個分類連結
$cats = get_the_category(); // 回傳 WP_Term 陣列
if ( $cats ) {
$url = get_category_link( $cats[0] );
}
5. 取得所有分類連結(導航選單常用)
$categories = get_categories(['hide_empty' => false]);
foreach ( $categories as $cat ) {
echo '' . esc_html( $cat->name ) . '';
}
延伸:取得標籤、自訂分類法連結
| 分類法 | 取得連結函數 | 備註 |
| 標籤 | get_tag_link( $tag_id ) | 或 get_term_link( $term, 'post_tag' ) |
| 自訂分類法 | get_term_link( $term, 'taxonomy_slug' ) | 通用函數,支援所有分類法 |
常見錯誤與最佳實務
| 錯誤 | 正確做法 |
| 直接 echo get_category_link() 未轉義 | 輸出前務必 esc_url() |
| 在迴圈外用 get_post() 未傳 ID | 明確傳入 ID 或使用 WP_Query |
| 混淆 post_name (slug) 與 post_title | 連結用 post_name,顯示用 post_title |
| 大量查詢分類連結未快取 | 使用 get_categories() 一次撈取,避免 N+1 |
原始碼位置
get_post():wp-includes/post.php
get_category_link():wp-includes/category-template.php
小結
get_post() 是取得文章資料的核心入口,靈活的輸出格式適應不同場景;get_category_link() 配合 get_category_by_slug()、get_cat_ID() 等輔助函數,能從任意已知資訊精準產生分類 URL。善用 get_term_link() 統一處理所有分類法,程式碼更簡潔一致。