phân loại tùy chỉnh và các trang viết lại xung đột sên cho 404


9

Tôi đang sử dụng plugin UI Loại bài đăng tùy chỉnh để tạo các nguyên tắc phân loại tùy chỉnh của mình. Tôi có một danh mục đầu tư được tạo thành từ các dự án (loại bài tùy chỉnh) với 2 phân loại tùy chỉnh của công nghệ và khách hàng. Phân loại khách hàng có sên viết lại tùy chỉnh portfolio/clients/, trong khi phân loại công nghệ có sên viết lại tùy chỉnhportfolio/

Viết lại:
portfolio/html <- trang hiển thị tất cả các dự án bằng HTML
portfolio/clients/client-a<- trang hiển thị tất cả các dự án cho khách hàng A

Bây giờ khi tôi cố gắng tạo một trang đích cho các máy khách có sên url, /portfolio/clientstôi nhận được trang 404. Tôi khá chắc chắn điều này là do các xung đột viết lại url của phân loại công nghệ. Tôi đoán khi nó tìm kiếm nó trong phân loại công nghệ, nó không tồn tại sau đó nó xuất hiện trên trang 404. Vậy làm cách nào để làm cho sên viết lại url hoạt động để khi tôi nhấn /portfolio/clients, nó không gửi lại trang 404 và nó sử dụng đúng mẫu trang?

Câu trả lời:


16

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ừ portfoliophâ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_rulesmảng. Vì lý do này, nhiều người móc vào các rewrite_rules_arraybộ 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".


Thông minh! Cảm ơn tháng giêng! Điều này đã làm việc. Tôi không thể nhận được một lời giải thích tốt hơn.
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.