Thông thường, khi đăng ký Custom Post Type (CPT), chúng ta hay viết các hàm rời rạc trong file functions.php. Điều này dễ dẫn đến xung đột tên hàm và khó bảo trì. Đoạn code dưới đây sẽ hướng dẫn bạn cách đóng gói (encapsulation) mọi thứ vào một Class duy nhất.
1. Sử dụng Singleton Pattern
Tại sao cần? Chúng ta chỉ cần duy nhất một “thực thể” quản lý Post Type này trong suốt vòng đời của ứng dụng.
private static ?Property_Post_Type $instance = null;
public static function instance(): self {
if ( self::$instance === null ) {
self::$instance = new self();
}
return self::$instance;
}
Lợi ích: Ngăn chặn việc khởi tạo class nhiều lần không cần thiết, giúp tiết kiệm tài nguyên.
2. Quản lý thông qua Cấu hình (Configuration over Coding)
Thay vì viết lặp đi lặp lại hàm register_taxonomy cho 4-5 cái khác nhau, đoạn code sử dụng một mảng Constant để lưu cấu hình.
private const TAXONOMIES = [
'property_status' => [
'label' => 'Property Status',
'hierarchical' => false,
],
// ... thêm các taxonomy khác ở đây
];
Clean Code Tip: Khi bạn muốn thêm một phân loại mới, bạn chỉ cần thêm 1 dòng vào mảng này thay vì copy-paste cả một khối code dài. Điều này tuân thủ nguyên lý DRY (Don’t Repeat Yourself).
3. Tận dụng tính năng lặp (Looping) để đăng ký
Hàm register_taxonomies sẽ tự động duyệt qua danh sách cấu hình trên để đăng ký với WordPress.
public function register_taxonomies(): void {
foreach ( self::TAXONOMIES as $key => $config ) {
$this->register_taxonomy( $key, $config );
}
}
Cách tiếp cận này giúp hàm xử lý logic trở nên ngắn gọn và tách biệt hoàn toàn với dữ liệu khai báo.
4. Bảo mật và Type Hinting
Đoạn code sử dụng các tiêu chuẩn PHP hiện đại:
if ( ! defined( 'ABSPATH' ) ) exit;: Ngăn chặn truy cập trực tiếp vào file từ trình duyệt.- Type Hinting (
: void,: self,string $key): Giúp trình soạn thảo code (như VS Code) hiểu bạn đang làm gì, từ đó gợi ý code chính xác và giảm thiểu lỗi logic.
Cách sử dụng
Để sử dụng Class này, bạn chỉ cần copy vào một file (ví dụ: inc/class-property-post-type.php) và require nó trong theme:
require_once get_template_directory() . '/inc/class-property-post-type.php';
Xem đầy đủ tại đây: https://youtu.be/nFFW3LUTRDg?si=SQbaebXq-U0QNIYm