Bài viết chia sẻ cách rewrite custom post type trong WordPress giúp bạn tùy chỉnh cấu trúc URL của các bài viết thuộc bài viết tùy chỉnh.Bạn có thể tham khảo bài Registering Custom Post Types trên trang chủ WordPress để tìm hiểu cụ thể nhé .
Cách rewrite custom post type trong WordPress
Bước 1: Tạo Custom Post Type
Đầu tiên, bạn cần đăng ký Custom Post Type trong tệp functions.php
của theme hoặc thông qua một plugin riêng.
function create_custom_post_type() { $labels = array( 'name' => 'Movies', 'singular_name' => 'Movie', 'menu_name' => 'Movies', 'name_admin_bar' => 'Movie', ); $args = array( 'labels' => $labels, 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'films'), // Đây là nơi bạn thiết lập rewrite. 'supports' => array('title', 'editor', 'thumbnail'), ); register_post_type('movies', $args); } add_action('init', 'create_custom_post_type');
Bước 2: Thiết lập Rewrite cho CPT
Trong ví dụ trên, phần rewrite => array('slug' => 'films')
cho phép bạn định nghĩa lại URL slug cho CPT. Điều này có nghĩa là URL của các bài viết thuộc CPT movies
sẽ có dạng:
https://yourdomain.com/films/post-name/
Các tùy chọn bổ sung cho rewrite
:
Bạn có thể thêm các tùy chọn bổ sung vào mảng rewrite
như sau:
slug
: Định nghĩa đường dẫn cơ bản cho CPT. Ví dụ:'slug' => 'films'
.with_front
: Nếutrue
, URL sẽ bao gồm cấu trúc permalink trước đó. Ví dụ:'slug' => 'films', 'with_front' => false
.pages
: Cho phép phân trang cho các bài viết CPT. Mặc định làtrue
.feeds
: Cho phép RSS feeds cho CPT. Mặc định làtrue
.
'rewrite' => array('slug' => 'films', 'with_front' => false, 'pages' => true, 'feeds' => false)
Bước 3: Flush Permalinks
Mỗi khi bạn thay đổi cấu trúc permalink của Custom Post Type, bạn cần flush permalinks để WordPress nhận biết sự thay đổi. Bạn có thể thực hiện điều này bằng cách vào Settings > Permalinks
và nhấn “Save Changes” mà không cần thay đổi gì.
Ví dụ phức tạp hơn:
Nếu bạn muốn tạo một cấu trúc phức tạp hơn, chẳng hạn như genre/action/post-name
, bạn có thể làm như sau
'rewrite' => array('slug' => 'genre/%genre%', 'with_front' => false)
Trong đó, %genre%
là một taxonomy đã được đăng ký trước cho CPT này. Bạn cần sử dụng hook post_type_link
để thay thế %genre%
bằng giá trị thật.
Bước 4: Hook để thay thế giá trị động (nếu cần)
Nếu bạn sử dụng biến động như %genre%
trong slug, bạn cần sử dụng thêm đoạn mã sau
function custom_post_type_link($post_link, $post) { if (is_object($post) && $post->post_type == 'movies') { $terms = wp_get_object_terms($post->ID, 'genre'); if ($terms) { return str_replace('%genre%', $terms[0]->slug, $post_link); } } return $post_link; } add_filter('post_type_link', 'custom_post_type_link', 1, 2);
Như vậy, URL sẽ được thay thế bằng slug thật của taxonomy genre
.
Kết lại
Tạo và tùy chỉnh Custom Post Type giúp bạn mở rộng chức năng của WordPress, phù hợp với nhiều loại nội dung khác nhau. Khi hoàn thành, hãy đảm bảo bạn đã kiểm tra kỹ lưỡng để tránh lỗi và tối ưu hóa trải nghiệm người dùng.