Sự khác biệt cơ bản là:
- Việc
add_rewrite_rule()
thêm một quy tắc cụ thể được giải thích
- Việc
add_rewrite_tag()
thêm một trình giữ chỗ để sử dụng trong các cấu trúc url. Giữ chỗ này sau đó được sử dụng để tạo ra nhiều quy tắc.
Ví dụ: giả sử bạn là đại lý quảng cáo khách sạn ở nhiều quốc gia khác nhau. Bạn có thể muốn một url của khách sạn giống như
www.example.com/hotels/UK/Balmoral
Trường hợp quốc gia (Vương quốc Anh trong ví dụ này) là một thuật ngữ phân loại tùy chỉnh và Balmoral là một khách sạn (loại bài đăng). Chúng tôi có thể thêm quy tắc viết lại cho điều này, nhưng sau đó chúng tôi sẽ phải tạo quy tắc cho:
- chính khách sạn
- các tệp đính kèm của khách sạn
- Một quy tắc cho các khách sạn (bài viết) nơi nó tràn qua nhiều trang, v.v.
Tạo các quy tắc này có thể trở nên phức tạp. Hơn nữa, chúng tôi có thể sẽ cạnh tranh với các quy tắc riêng của WordPress cho loại bài đăng đó - được tạo từ cơ sở hạ tầng mà chúng tôi đặt khi đăng ký loại bài đăng. (Trong mọi trường hợp, hãy để WordPress thực hiện công việc).
'Cơ sở hạ tầng' này - tương tự như những gì bạn đã đặt cho các bài đăng trong cài đặt permalink - xác định quy tắc viết lại mà WordPress tạo ra. Nhưng vì chúng tôi muốn một cấu trúc có chứa một số không xác định (quốc gia) - mà chúng tôi muốn giải thích - chúng tôi cần cung cấp một trình giữ chỗ của biểu mẫu %country%
. (Nó gần giống %category%
với bài viết).
Ví dụ:
add_action_init('init','wpse71305_register_types');
function wpse71305_register_types(){
//You'll need to register the country taxonomy here too.
//Add 'country' tag.
add_rewrite_tag('%country%', '([^&/]+)'));
//Register hotel post type with %country$ tag
$args = array(
...
'has_archive'=>true,
'rewrite' => array(
'slug'=>'hotels/%country%',
'with_front'=> false,
'feed'=> true,
'pages'=> true
)
...
);
register_post_type('hotel',$args);
}
Lưu ý: WordPress không biết cách tạo url từ %country%
thẻ - bạn cần yêu cầu nó làm điều đó. (Tôi trình bày điều này trong một bài viết tôi đã liên kết đến bên dưới).
Cuối cùng, WordPress cũng sẽ lưu trữ giá trị phù hợp để bạn có thể truy xuất nó thông qua get_query_var()
(điều mà bạn không có với quy tắc viết lại tiêu chuẩn).
Bạn cũng có thể tạo các thẻ được sử dụng trong cơ sở hạ tầng của bài viết (đặt nó trong trang cài đặt Permalink).
Bằng cách thêm một thẻ, chúng ta có thể sử dụng nó trong hoán vị. WordPress thì biết
- Những gì mong đợi
- Cách diễn giải url (kiểm tra nó khớp)
- Cách diễn giải giá trị (nghĩa là 'Vương quốc Anh')
(Để tham khảo xem bài viết này tôi đã viết: http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/ ).
Chỉnh sửa
Như đã lưu ý trong các ý kiến, ví dụ trên là một người nghèo như register_taxonomy()
trong thực tế các cuộc gọi add_rewrite_tag()
.
Về tài liệu Codex về việc sử dụng chúng 'kết hợp': điều này có thể gây hiểu lầm vì cả hai đều có thể được sử dụng độc lập. Tuy nhiên, như đã lưu ý ở trên, hãy add_rewrite_tag()
thêm tên thẻ vào WordPress - hiểu 'các biến truy vấn'. Trong thực tế điều này cho phép bạn lấy giá trị với get_query_var()
. Do đó, khi add_rewrite_rule()
được sử dụng add_rewrite_tag()
, biến sẽ được lưu trữ bởi WordPress. Nhưng có nhiều cách khác để làm điều này (xem câu trả lời này - cũng lưu ý nhận xét của Rob Vermerer).
Cũng liên quan: Làm cách nào để truy xuất các biến $ _GET từ các URL được viết lại?
add_rewrite_tag()
có thể được sử dụng để làm cho giữ chỗ được sử dụngSettings->Permalinks
. Về việc sử dụng một nguyên tắc phân loại, nó có phải là một yêu cầu để sử dụngadd_rewrite_tag()
không? Ấn tượng của tôi từ trang Codex là nó không phải, nhưng nó dường như thường được sử dụng. Tôi đã mở rộng câu hỏi của mình liên quan đến việc sử dụngadd_rewrite_tag()
kết hợp vớiadd_rewrite_rule()
như được đề xuất trong trang Codex .