Quy tắc viết lại tùy chỉnh cho trang lưu trữ và bài đăng đơn


8

Tôi đang xây dựng một trang Wordpress với một số loại bài tùy chỉnh. Mỗi loại bài đăng là một tạp chí khác nhau. Tôi cũng có một trường meta tùy chỉnh cho một năm tạp chí và vấn đề.

Tôi muốn có các url (được sử dụng archive.php):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/

Tôi đã làm nó bằng mã:

function magazine_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})');
    add_rewrite_tag('%issue%', '([0-9])');
}
add_action('init', 'magazine_rewrite_tag', 10, 0);

và:

function magazine_rewrite_rules() {
    add_rewrite_rule('^([a-z]+)/([0-9]{4})/([0-9])?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');
    add_rewrite_rule('^([a-z]+)/([0-9]{4})?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}
add_action('init', 'magazine_rewrite_rules');

Dĩ nhiên tôi cũng có một truy vấn tùy chỉnh trong archive.php. Và nó hoạt động tốt.

Nhưng bây giờ, các url của tôi cho các bài viết đơn lẻ không hoạt động. Theo mặc định, đó là:

http://my_site/magazine/post-title

nhưng nó hiển thị tất cả các bài viết từ tạp chí như url (và nó đã sử dụng mẫu archive.php):

http://my_site/magazine/

Làm thế nào thêm quy tắc viết lại đúng cho bài viết tùy chỉnh duy nhất? Có thể, tôi muốn có các url cho một bài đăng (chỉ dành cho các loại bài đăng tùy chỉnh đã chọn) ở định dạng này:

http://my_site/magazine/year/issue/post-title

Nhiều ghi chú: (1) Đối số thứ 4 là số lượng đối số mà bộ lọc hoặc hành động thực hiện. Và 10ưu tiên mặc định . Bạn có thể bỏ cả hai trong trường hợp đó hoặc thử số cao hơn. (2) Bạn đã kiểm tra các quy tắc viết lại kết quả chưa? Ngoài ra, hãy đảm bảo bạn kiểm tra thứ tự của các quy tắc đó khi chúng được xử lý theo thứ tự của chúng. Đổ rác $GLOBALS['wp_rewrite']. (3) Bạn đã thêm query_vars rằng có thể xung đột?
kaiser

Câu trả lời:


4

Tôi tìm giải pháp! Một plugin Monkeyman Rewrite Phân tích rất hữu ích: https://wordpress.org/plugins/monkeyman-rewrite-analyzer/

Vì vậy, bây giờ, tôi có các url làm việc như vậy ...

đơn.php:

/magazine-name/issue-year/issue/article-name

lưu trữ.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name

Trên trang chỉnh sửa bài đăng tùy chỉnh trong wp-admin, tôi sử dụng plugin Advanced Custom Field cho năm phát hành và sự cố. Bạn cũng có thể tự xác định các trường meta.

Tiếp theo tôi đã thêm các thẻ viết lại cho năm phát hành và vấn đề:

function custom_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})' );
    add_rewrite_tag('%issue%', '([0-9]+)' );
}

add_action('init', 'custom_rewrite_tag');

Tiếp theo, tôi đã thêm các quy tắc viết lại viết lại cho bất kỳ sự kết hợp nào của các url:

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]', 'top');

    // URL: /magazine/year/issue
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');

    // URL: /magazine/year
    add_rewrite_rule('^([^/]+)/([0-9]{4})?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}

add_action('init', 'custom_rewrite_rule');

Cuối cùng, tôi thay thế các url tiêu chuẩn cho riêng mình, với năm phát hành và vấn đề

function custom_permalink($url, $post) {
    if ($post->post_type == 'magazine-name-1' || $post->post_type == 'magazine-name-2' || $post->post_type == 'magazine-name-2' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field('issue_year', $post->ID); // ACF; for meta: get_post_meta($post->ID, '$issue', true);
        $issue = get_field('issue', $post->ID); // ACF

        $url = str_replace( $post_type . '/', $post_type . '/' . $issue_year . '/' . $issue . '/' , $url);
    }
    return $url;
}
add_filter('post_type_link', 'custom_permalink', 10, 2);
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.