WordPress
Custom Post Type (CPT) คืออะไร?
Custom Post Type หรือ CPT คือเนื้อหาพิเศษใน WordPress นอกเหนือจากค่าเริ่มต้น Post และ Page ตัวอย่างเช่น Portfolio (สำหรับแสดงผลงาน), Products (สำหรับสินค้า), Testimonials (สำหรับเสียงสะท้อน), Team Members (สำหรับสมาชิกทีม) หรือ Case Studies (สำหรับการศึกษากรณี)
WordPress มาพร้อมกับ CPT มาตรฐาน เช่น Attachment, Revision, Nav Menu Item แต่จำนวนมากมายไม่พอสำหรับทุกจุดประสงค์ การสร้าง CPT ของเราเอง ช่วยให้เนื้อหาจัดระเบียบได้ดีขึ้น แต่ละประเภทจะมี Admin Menu ของตัวเอง Custom Fields ของตัวเอง และสามารถตั้งค่า Template การแสดงผลแยกต่างหากได้
ทำไมต้องใช้ Custom Post Type?
หากไม่มี CPT คุณอาจลองเก็บข้อมูลต่างประเภท ลงในโพสต์ปกติแล้วใช้ Category หรือ Tag เพื่อแยกแยะ วิธีนี้ทำให้หลังบ้านของ WordPress ยุ่งเหยิง Admin Dashboard เต็มไปด้วยข้อมูลที่ไม่เกี่ยวข้องกัน ประโยชน์ของ CPT:
- จัดระเบียบที่ดีขึ้น: แต่ละประเภทเนื้อหามี Menu ของตัวเองใน Admin Panel ชัดเจนและจัดระเบียบ
- UX ที่ดีสำหรับผู้ใช้: ลูกค้าหรือเจ้าของเว็บ ไม่ต้องสับสนกับ Post ปกติ เห็นเพียง Menu ของข้อมูลที่เกี่ยวข้อง
- Custom Fields เฉพาะเจาะจง: เพิ่ม Fields ที่ต้องการให้กับ CPT นั้นเท่านั้น ไม่ให้มีพื้นที่ว่างเปล่าในฟอร์ม
- Template ที่ใช้ได้ต่างกัน: Archive Page และ Single Page ของ CPT สามารถใช้ Template ที่ออกแบบแยกต่างหากได้
- ไม่กระทบ SEO ของ Blog: Post Blog หลักจะไม่ผสมกับเนื้อหา CPT ทำให้ Archive Page และ Feed จัดระเบียบ
ปัญหากับการเขียนโค้ดใน functions.php
สำหรับผู้ใช้ Shared Hosting ที่ใช้ Hosting Control Panel (เช่น cPanel) ที่ไม่สะดวกในการแก้ไข functions.php โดยตรง (หรือกลัวหกล้ม) มีปัญหาหลายประการ:
- เสี่ยงหายเมื่อเปลี่ยนธีม: ถ้าเปลี่ยนธีมและ functions.php ใหม่ไม่มีโค้ดเดิม ข้อมูล CPT ที่เขียนลงจะหายไปทั้งหมด
- ไม่มี Admin UI: ต้องเขียนโค้ด PHP เอง ไม่มี Admin Panel ให้คลิกเพื่อเพิ่ม/แก้ไข CPT
- ความเสี่ยง: เขียนโค้ดผิด อาจทำให้เว็บขาวหรือมี Error บนหน้าแอดมิน
- ไม่เหมาะสำหรับมือใหม่: ต้องรู้ WordPress Hook ต่าง ๆ ที่เกี่ยวข้อง ซึ่งมือใหม่อาจไม่คุ้นเคย
Plugin ยอดนิยมสำหรับ Custom Post Type
1. Custom Post Type UI (CPT UI)
Custom Post Type UI คือ Plugin ฟรี ยอดนิยมที่ใช้ Admin Panel ให้ลงทะเบียน (Register) Post Type และ Taxonomy ใหม่ โดยไม่ต้องเขียนโค้ด
- ฟรี 100%: ไม่มีเวอร์ชันที่ต้องจ่ายเงิน
- ง่ายต่อใช้: กรอกชื่อ (Singular/Plural) เลือก Icon และ Settings
- สามารถ Export/Import: ดาวน์โหลด CPT เป็น JSON ถ้าต้องย้ายเว็บ
- รองรับ Taxonomy: สามารถสร้าง Taxonomy (เหมือน Category) เฉพาะสำหรับ CPT ได้
2. Advanced Custom Fields (ACF)
Advanced Custom Fields เป็น Plugin ยอดนิยมที่ใช้เพิ่ม Custom Field เข้าไป Post Type ใดก็ได้ (ปกติหรือ Custom) ช่องข้อมูลสามารถเป็นแบบ Text, Image, Date, Repeater (ซ้ำได้หลายแถว) เป็นต้น
- เวอร์ชัน Free: รองรับ Text, Textarea, Select, Image, File, Date และเบื้องต้น
- ACF Pro: เพิ่ม Advanced Field Type เช่น Repeater, Flexible Content, Relationship เป็นต้น
- ใช้คู่กับ CPT UI: ขั้นแรกสร้าง CPT ด้วย CPT UI แล้วไปสร้าง Field Group ใน ACF ตั้งค่า "Post Type เท่ากับ [CPT ของฉัน]"
- Template Front-end: เมื่อเพิ่ม Field เสร็จแล้ว ต้องแก้ Template Theme เพื่อให้มันแสดงผล ใช้ฟังก์ชัน
get_field()
3. Pods
Pods คือ All-in-One Solution ที่รวมฟีเจอร์ของ CPT UI และ ACF ไว้ที่เดียว สร้างได้ทั้ง Post Type และ Custom Field ใน Plugin เดียว
- เวอร์ชัน Free อัดแน่นฟีเจอร์: รองรับ Post Type, Custom Field, Relationship ครบครัน
- Pods Pro: ยังมี Advanced Features เพิ่มเติม
- Component-based: สร้าง Component ซ้ำใช้ได้ (เหมือน Field Group ใน ACF แต่ยืดหยุ่นกว่า)
- Front-end Templates: มี Template Editor ในตัว ช่วยให้แสดงผล CPT ได้ง่ายขึ้น (ยังต้อง CSS/HTML แต่มี Helper มากกว่า)
ขั้นตอน: สร้าง CPT ด้วย CPT UI และ ACF
ขั้นตอนต่อไปนี้อธิบายวิธีสร้าง CPT ใหม่ "Portfolio" (พอร์ตโฟลิโอ) เพื่อแสดงผลงานของคุณ:
ขั้นที่ 1: ติดตั้ง Custom Post Type UI
- ไปที่ WordPress Admin Dashboard
- เลือก Plugins > Add New Plugin
- ค้นหา "Custom Post Type UI"
- คลิก Install Now แล้วกด Activate
ขั้นที่ 2: สร้าง Post Type ใหม่
- ในแดชบอร์ด Admin ไปที่ CPT UI > Add/Edit Post Types
- คลิก Add New Post Type
- กรอกข้อมูล:
- Post Type Singular Label: Portfolio (ชื่อเดี่ยว)
- Post Type Plural Label: Portfolios (ชื่อพหูพจน์)
- Post Type Name: portfolio (ชื่อ slug ที่ใช้ใน URL)
- Description: "Showcase of my works and projects"
- ลงมาที่ Settings เลือก:
- ✓ Public
- ✓ Show in Admin Bar
- ✓ Show in REST API (สำหรับความเข้ากันได้ในอนาคต)
- ที่ด้านล่างสุด ให้เลือก Icon สำหรับ Menu (เช่น
dashicons-images-altสำหรับรูปภาพ) - คลิก Add Post Type
- ตอนนี้ Menu "Portfolios" จะปรากฏในแดชบอร์ด Admin
ขั้นที่ 3: ติดตั้ง Advanced Custom Fields (ACF)
- ไปที่ Plugins > Add New Plugin
- ค้นหา "Advanced Custom Fields"
- ติดตั้ง และกด Activate
ขั้นที่ 4: เพิ่ม Custom Field ให้กับ Post Type
- ในแดชบอร์ด ไปที่ ACF > Field Groups
- คลิก Add New Field Group
- ตั้งชื่อ Field Group เช่น "Portfolio Details"
- ด้านล่าง คลิก Add Field เพื่อเพิ่ม Field แรก
- เพิ่มฟิลด์เหล่านี้:
- Field Name: client_name | Type: Text | Label: ชื่อไคลเอนต์
- Field Name: project_url | Type: URL | Label: ลิงก์โครงการ
- Field Name: project_image | Type: Image | Label: รูปภาพโครงการ
- Field Name: technologies | Type: Text | Label: เทคโนโลยีที่ใช้
- เลื่อนลงมา ที่ "Display Location" ให้เลือก Post Type is equal to Portfolio
- คลิก Publish
ขั้นที่ 5: เพิ่มข้อมูล Portfolio ใหม่
- ไปที่ Portfolios ในเมนู Admin
- คลิก Add New Portfolio
- กรอก Title และ Description ปกติเหมือน Post
- เลื่อนลง จะเห็น Field ที่สร้าง (ชื่อไคลเอนต์, ลิงก์โครงการ, รูปภาพ, เทคโนโลยี)
- กรอกข้อมูลลงไป
- คลิก Publish
ขั้นที่ 6: สร้าง Template แสดงผล (ต้องแก้โค้ด Theme)
ขั้นนี้ต้องแตะโค้ด HTML/PHP เล็กน้อย หรือใช้ Block Theme Editor:
- ถ้าใช้ Classic Theme: ไปที่ Appearance > Theme File Editor แล้วแก้ไขไฟล์
single-portfolio.php(ถ้ายังไม่มี ให้สร้างไฟล์ใหม่) ตัวอย่าง:<div class="portfolio-item"> <h1><?php the_title(); ?></h1> <p>ไคลเอนต์: <?php echo get_field('client_name'); ?></p> <img src="<?php echo get_field('project_image')['url']; ?>" alt="Project"> <p><?php echo get_field('technologies'); ?></p> <a href="<?php echo get_field('project_url'); ?>">ดูโครงการ</a> </div> - ถ้าใช้ Block Theme (เช่น Twenty Twenty-Four): ไปที่ Appearance > Patterns และสร้าง Pattern สำหรับ single-portfolio และสามารถใช้ Block ต่าง ๆ ผสมกับ Custom HTML เพื่อแสดงค่า ACF Field
ข้อมูลเพิ่มเติม: การใช้ ACF Pro
หากต้องการฟีเจอร์ขั้นสูง เช่น Repeater Field (เพื่อเพิ่มข้อมูลหลายแถวในรูปแบบ Row) หรือ Flexible Content ให้ไปซื้อ ACF Pro (แล้วนำเข้าลิขสิทธิ์) ตัวอย่างเช่น หาก Portfolio ต้องแสดงหลาย Screenshot:
// ตัวอย่าง Repeater Field ใน ACF Pro
if ( have_rows('project_screenshots') ) {
while ( have_rows('project_screenshots') ) {
the_row();
$image = get_sub_field('screenshot_image');
echo '<img src="' . $image['url'] . '">';
}
}
ตรวจสอบว่า Custom Post Type ทำงานถูกต้อง
หลังจากตั้งค่าเสร็จแล้ว ให้ทดสอบด้วยขั้นตอนต่อไปนี้:
# 1. เข้าแดชบอร์ด Admin ตรวจสอบว่า Menu "Portfolios" ปรากฏ
# 2. สร้าง Portfolio ใหม่ และเพิ่มข้อมูล Field ทั้งหมด
# 3. Publish และตรวจสอบ URL ใหม่
# ควรเป็น: https://yourdomain.com/portfolio/portfolio-name
# 4. ตรวจสอบว่า Permalink ทำงาน (ไม่ขึ้น 404)
# 5. ดูเนื้อหา CPT ที่ Archive Page
# ควรเป็น: https://yourdomain.com/portfolio
แก้ปัญหาที่พบบ่อย
Error: "ไม่เห็น Menu ของ Custom Post Type ใน Admin"
ปัญหานี้มักเกิดจากการ ตั้งค่า Public ไม่ถูก ให้ไปที่ CPT UI > Add/Edit Post Types แล้วเลือก Post Type ที่สร้าง แล้วตรวจสอบว่า "Show in Menu" ถูกติ๊ก ถ้ายังไม่ปรากฏ ให้ลองรีเฟรช Admin Panel หรือ Reload หน้า
Error: "Custom Field ไม่ปรากฏเมื่อแก้ไข Post"
อาจเกิดจาก Field Group ยังไม่กำหนดให้มองเห็นกับ Post Type นี้ ให้ไปที่ ACF > Field Groups คลิกแก้ไข Field Group ที่สร้าง แล้วตรวจสอบที่ด้านล่างว่า "Display Location" ตั้งค่า "Post Type is equal to [CPT ที่ต้องการ]" ถูกหรือไม่ บันทึกหลังจากแก้ไข
Error: "Permalink 404 หลังจากสร้าง CPT"
นี่คือปัญหาทั่วไป WordPress ต้องรีเซ็ต Permalink Settings เมื่อมี Post Type ใหม่ ไปที่ Settings > Permalinks ปล่อยให้เป็นค่าเดิม แล้วคลิก "Save Changes" ระบบจะสร้างค่า .htaccess ใหม่ และ Permalink ควรทำงานแล้ว
Error: "ข้อมูล Field ACF ว่างเปล่าเมื่อแสดงผลบน Front-end"
ปัญหานี้เกิดจากการใช้ฟังก์ชัน get_field() ไม่ถูก ตัวอักษรของชื่อ Field Name ต้องตรงกัน (ใช้ Underscore ไม่ใช่ Dash) ตัวอย่างถูก: get_field('client_name'); ถ้า Field Name ผิด ค่าจะเป็น false
Error: "Plugin ขัดแย้ง Custom Post Type ไม่เห็น"
หากใช้ Plugin หลาย ตัวที่สร้าง CPT (เช่น WooCommerce, Easy Digital Downloads) อาจมีชื่อ CPT ที่ซ้ำกัน หรือเกิด Conflict เลิกทำงาน ให้ลองปิด Plugin ตัวอื่นลงนอกเหนือจาก CPT UI และ ACF เพื่อแยก ปัญหา
คำถามที่พบบ่อย
Q: ความต่างระหว่าง Custom Post Type และ Custom Taxonomy คืออะไร?
A: Post Type คือประเภทของเนื้อหา (เช่น Posts, Pages, Products) Taxonomy คือวิธีจัดกลุ่ม (เช่น Categories, Tags) โดยพื้นฐานของ WordPress แล้ว Post Type ของเรา (เช่น Portfolio) สามารถใช้ Category/Tag ของ Post ธรรมดาได้ แต่ Custom Taxonomy ช่วยให้สร้างระบบจำแนกแยกเพื่อ CPT นั้น เช่น "Portfolio Category" "Portfolio Skill Tag" โดยไม่กระทบกับ Post Categories
Q: ถ้าเปลี่ยนธีม ข้อมูล Custom Post Type หายไปไหม?
A: ข้อมูลจะไม่หายไป จะหายไปแค่ Template ของการแสดงผลเท่านั้น เนื้อหา Custom Post Type ทั้งหมด (บันทึก) จะเก็บอยู่ในฐานข้อมูล และยังคงอยู่เมื่อเปลี่ยนธีม หากเปลี่ยนธีมแล้วไม่เห็น CPT ลองรีเซ็ต Permalink Settings อีกครั้ง และตรวจสอบว่าธีมใหม่รองรับการแสดงผล Post Type นั้น ๆ
Q: สามารถเพิ่ม Custom Field ให้กับ Post Type มาตรฐาน (Posts, Pages) ได้ไหม?
A: ได้ครับ Advanced Custom Fields (ACF) สามารถเพิ่ม Field ให้กับ Post, Page, หรือ Custom Post Type ใดก็ได้ เมื่อสร้าง Field Group ใน ACF เพียงตั้ง "Display Location" เป็น "Post Type is equal to post" (สำหรับ Post ธรรมดา) หรือ "post_type is equal to page" (สำหรับ Page) ก็เสร็จแล้ว