Permalinks: loại bài tùy chỉnh -> phân loại tùy chỉnh -> bài


39

Tôi gặp sự cố khi làm việc với các quy tắc viết lại của WordPress và có thể sử dụng một số trợ giúp.

Tôi có một loại bài tùy chỉnh được gọi là _shows_.

Tất cả các chương trình có một loại phân loại tùy chỉnh duy nhất _show-category_.A _show_sẽ không bao giờ có nhiều hơn một _show-category_.

Tôi muốn các url của tôi định tuyến theo cách này:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

Vì vậy, như một ví dụ trong thế giới thực, giả sử chúng ta có một _show-category_"Foo" và một _show_bài đăng có tiêu đề "Bar" có "Foo" như nó _show-category_. Tôi hy vọng ứng dụng WordPress của mình sẽ trông như thế này:

www.mysite.com/shows/foo/ => shows all posts under the foo category
www.mysite.com/shows/foo/bar => shows the indivual post

Tôi cố gắng tránh các plugin khi có thể, nhưng tôi sẵn sàng cho bất kỳ giải pháp nào.


1
chỉ trỏ bạn đến một cái gì đó tôi đã phải làm trước khi .. wordpress.stackexchange.com/questions/102246/...
reikyoushin

Câu trả lời:


70

Đầu tiên, đăng ký phân loại của bạn và thiết lập các slugđối số của rewriteđể shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

Tiếp theo, đăng ký loại bài đăng của bạn và đặt sên thành shows/%show_category%và đặt has_archiveđối số thành shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

Cuối cùng, thêm bộ lọc để post_type_linkthay thế danh mục chương trình trong permalinks hiển thị riêng lẻ:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

CHỈNH SỬA

Quên các has_archiveđối số register_post_typeở trên, nên được đặt thành shows.


1
Milo, cảm ơn bạn! Bộ lọc post_type_link là phần còn thiếu đối với tôi. Bất cứ ai đọc chủ đề này đều có cùng một vấn đề, điều duy nhất cần lưu ý là có một lỗi nhỏ trên hàm wpa_show_permalinks, trong đó $ post-> post_type == 'show' thực sự phải là 'hiển thị'. Cảm ơn một lần nữa Milo!
Paul T

4
Nếu bạn đang thực hiện thay đổi đối với phiên bản WordPress hiện có, hãy đảm bảo bạn truy cập Cài đặt> Permalinks và nhấp vào lưu. Những thay đổi bạn đã thực hiện trong hàm.php sẽ không có hiệu lực cho đến khi bạn thực hiện.
Jay Neely

2
Điều này gần như hiệu quả với tôi khi phân loại hiển thị trên trang loại bài đăng, / post_type / taxonomy / là một trang hợp pháp (trước đây là 404) nhưng / post_type / taxonomy / post của tôi là 404'ing. Tôi nhận thấy khi đăng ký phân loại trên cả "show_carget", "show" đã được đăng ký, mặc dù chỉ có show_carget là phân loại. Tôi chỉ đăng ký phân loại.
thức

4
@Milo có cách nào để làm việc này với thuế phụ như chương trình / thuế / subax / bài không?
Benn

2
Tôi rất mong muốn điều này cũng sẽ hiệu quả với tôi nhưng mọi số ít đều kết thúc trong 404 ....
Beee
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.