Chào mọi người, để hưởng ứng tháng viết bài thì mình cũng có một bài chia sẻ về kiến thức làm việc của mình ạ (mình sẽ k bảo rằng là HR cứ ib đe dọa phải viết bài đâu ạ :< )
Chắc hẳn có nhiều bạn khi lập trình Wordpress, ít nhất một lần các bạn sẽ gặp trường hợp phân trang không hoạt động mà không biết lỗi tại sao. Trong một lần tạo post type thì mình gặp trường hợp là tạo 2 post type tương tự nhau, nhưng phân trang của loại 1 thì hoạt động còn loại 2 thì không hoạt động. Sau khi so sánh và xem xét thì mình nhận ra việc tạo post type trùng tên với slug trang sẽ gây ra lỗi này. Vậy lí do vì sao và cách xử lí như thế nào?
Xung đột Permalink:
WordPress sử dụng cấu trúc permalink để xác định URL của các trang và post type. Khi tên của post type và trang trùng lặp, WordPress có thể gặp khó khăn trong việc phân biệt chúng và do đó không thể phân trang đúng cách.
Cách xử lí:
Trường hợp đơn giản nhất:
Chúng ta chỉ cần thay đổi tên của post type hoặc tên slug của trang, nhưng thực tế trong project không phải lúc nào mình cũng làm được như vậy, mà yêu cầu bài toán lại bắt mình phải sử dụng đúng tên như được yêu cầu. Vậy cách tiếp theo sẽ giải đáp thắc mắc của các bạn
Sử Dụng Hàm add_rewrite_rule():
add_rewrite_rule( string $regex, string|array $query, string $after = 'bottom' )
Tham số:
$regex
(string): Đây là mẫu (pattern) chính quy (regular expression) dùng để so khớp với URL yêu cầu. Ví dụ: news/page/([0-9]+).
$query
(string|array): Đây là URL đích mà bạn muốn chuyển hướng đến khi mẫu khớp. Nó có thể là một chuỗi (string) hoặc một mảng (array) các chuỗi. Ví dụ: index.php?pagename=news&paged=$matches[1]. Bạn có thể sử dụng $matches
để tham chiếu các nhóm khớp từ $regex
. Ví dụ, $matches[1] lấy giá trị của nhóm khớp đầu tiên từ mẫu.
$after
(string): Đây là tùy chọn để xác định vị trí của quy tắc viết lại URL trong danh sách các quy tắc. Giá trị có thể là 'top' hoặc 'bottom'.'top' nghĩa là quy tắc này sẽ được kiểm tra trước các quy tắc khác.'bottom' (mặc định) nghĩa là quy tắc này sẽ được kiểm tra sau các quy tắc khác.
Ví dụ sử dụng:
add_action('init', function () {
add_rewrite_rule(
'^news/page/([0-9]+)', // Mẫu chính quy (regex) khớp với URL
'index.php?pagename=news&paged=$matches[1]', // URL đích với tham số truy vấn
'top' // Thứ tự kiểm tra quy tắc
);
});
Lưu ý:
Sau khi thêm quy tắc viết lại, bạn cần phải flush (làm mới) các quy tắc viết lại để đảm bảo chúng được áp dụng. Bạn có thể làm điều này bằng cách vào Settings -> Permalinks trong bảng điều khiển WordPress và nhấn Save Changes.
Hy vọng bài viết mà mình chia sẻ có thể giúp ích cho các bạn, cảm ơn các bạn đã đọc bài