Bạn dường như cần "quy tắc viết lại một phần dài dòng". Quy tắc viết lại dài dòng có nghĩa là tất cả các trang được đặt lên hàng đầu vì WordPress không thể tìm ra sự khác biệt giữa một trang và một bài đăng. Ở đây, nó nghĩ rằng nó có thể, bởi vì tất cả các URL của biểu mẫu portfolio/([^/]+)/
là từ portfolio
phân loại của bạn , ngoại trừ URL này portfolio/clients/
. Bạn sẽ phải đặt cái đó lên trên các quy tắc viết lại, để nó phù hợp trước khi phân loại danh mục đầu tư chung chung hơn. Bạn có thể cũng có thể buộc tất cả các quy tắc viết lại phải dài dòng, nhưng điều đó sẽ ảnh hưởng đến hiệu suất nếu bạn có nhiều trang.
Câu trả lời này được viết với sự hiểu biết vừa đạt được của tôi về các quy tắc viết lại, vì vậy tôi hy vọng đó là một cách tốt để làm điều đó và mã ví dụ không chứa quá nhiều lỗi.
Một trang không tạo ra chỉ một quy tắc viết lại, nó tạo ra một nhóm:
(pagename)/trackback/?$
(pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
(pagename)/(feed|rdf|rss|rss2|atom)/?$
(pagename)/page/?([0-9]{1,})/?$
(pagename)/comment-page-([0-9]{1,})/?$
(pagename)(/[0-9]+)?/?$
Bạn không phải tự tạo ra chúng, bạn có thể sử dụng lại sức mạnh của WP_Rewrite
. Nhìn vào page_rewrite_rules()
phương thức của nó : nếu chúng ta ở chế độ dài dòng, nó sẽ nhận được một danh sách tất cả các trang (thông qua page_uri_index()
) và các tệp đính kèm của chúng, ghi đè lên %pagename%
thẻ viết lại và tạo quy tắc viết lại cho trang này. Chúng ta cũng có thể làm điều này:
// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);
Điều này sẽ cung cấp cho chúng tôi các quy tắc cho các trang, nhưng chưa cho các tệp đính kèm được sử dụng trong trang. Nếu bạn cũng muốn chúng, bạn lặp lại bước cho mỗi tệp đính kèm, nhưng với add_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')
(xem page_rewrite_rules()
để biết thêm chi tiết).
Tốt, chúng tôi có các quy tắc, nhưng bây giờ bạn cần thêm chúng vào cấu trúc viết lại hoàn chỉnh theo một cách nào đó. Bạn có thể làm điều này với add_rewrite_rule()
, nhưng bạn phải gọi nó cho mọi quy tắc được tạo trong $page_rewrite_rules
mảng. Vì lý do này, nhiều người móc vào các rewrite_rules_array
bộ lọc , vì bạn chỉ có thể sửa đổi các mảng đó.
add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
global $wp_rewrite;
// The previous code snippet comes here, where we generate $page_rewrite_rules
// Our rules have priority, they should be on top
$rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);
return $rewrite_rules;
}
Sau khi bạn bao gồm bộ lọc này, bạn nên xóa các quy tắc viết lại (một lần, không phải mỗi lần tải trang, vì nó khá nặng). Bạn có thể thực hiện việc này bằng cách gọi flush_rewrite_rules()
hoặc bằng cách truy cập trang cài đặt "Permalinks".