Khi nào nên sử dụng add_rewrite_tag ()?


22

Tôi đã dành vài ngày cố gắng học cách thêm các quy tắc viết lại tốt nhất. Cho đến nay, sự hiểu biết của tôi là một cách phù hợp để thêm các quy tắc đơn giản là sử dụng add_rewrite_rules(), với lời cảm ơn lớn đến Jan Fabry trên sàn giao dịch này, những công phu đã được sử dụng rất nhiều.

Mặc dù ông đề cập add_rewrite_tags()rằng tôi chưa thấy một hướng dẫn nào về việc giải thích khi sử dụng nó, trái ngược với các cách khác để thêm quy tắc viết lại hoặc bất kỳ ví dụ hay nào về cách sử dụng. Nó dường như là một công cụ mạnh hơn, nhưng đó là tất cả những gì tôi có thể hiểu được. Tôi thấy các ví dụ trong Codex quá khó hiểu hoặc không đầy đủ . Ai đó có thể giải thích về nó hoặc chỉ vào một số tài nguyên? Tôi thấy không có gì hữu ích trên Google.

chỉnh sửa: Trang Codex của nónói về 'nói chung' sử dụng kết hợp với nóadd_rewrite_rules(), nhưng không chi tiết. Tương tự trang Codex đểadd_rewrite_rules()chỉadd_rewrite_tags()nhưng nó cũng rất thưa thớt về thông tin. Khi nào và làm thế nào một sự kết hợp như vậy sẽ được sử dụng? Ví dụ duy nhất tôi tìm thấy là câu trả lời này của Rob Vermeer mà tôi không hiểu.

Câu trả lời:


21

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?


Cảm ơn vì điều đó. Một điều mà tôi hiểu từ câu trả lời của bạn là add_rewrite_tag()có thể được sử dụng để làm cho giữ chỗ được sử dụng Settings->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ụng add_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ụng add_rewrite_tag()kết hợp với add_rewrite_rule()như được đề xuất trong trang Codex .
seron

Bạn hoàn toàn đúng về các nguyên tắc phân loại (một ví dụ tồi về phía tôi). Xem phần này của register_taxonomy(). Một ví dụ tốt hơn sẽ là khi bạn muốn sử dụng một cái gì đó giống như %country%nhưng khi quốc gia chỉ là một biến truy vấn phổ biến và không phải là phân loại. Những trường hợp này rất hiếm - tôi chưa bao giờ phải sử dụng add_rewrite_tag().
Stephen Harris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.