Sau khi kết hợp một loạt các câu trả lời khác, tôi đã làm cho nó hoạt động! Vì vậy, đây là giải pháp cho những bạn đang vật lộn với điều này:
Bài đăng này và bài này đã giúp tôi một số, vì vậy cảm ơn những người đó.
Lưu ý, tất cả mã này, cộng với loại bài đăng tùy chỉnh ban đầu và mã đăng ký phân loại đi vào functions.php
tệp của bạn .
Trước tiên, hãy lấy sên của bạn ngay khi xác định loại bài đăng và phân loại tùy chỉnh của bạn: đối với loại bài đăng tùy chỉnh thì nó phải là basename/%taxonomy_name%
và sên cho phân loại của bạn basename
. Đừng quên thêm 'hierarchical' => true
vào mảng viết lại phân loại để có được các thuật ngữ lồng nhau trong url của bạn. Cũng đảm bảo query_var
được đặt thành true
trong cả hai trường hợp.
Bạn cần thêm quy tắc viết lại mới để WordPress biết cách diễn giải cấu trúc url của bạn. Trong trường hợp của tôi, phần loại bài đăng tùy chỉnh của uri sẽ luôn là phân đoạn uri thứ 5, vì vậy tôi đã xác định quy tắc khớp của mình cho phù hợp. Lưu ý rằng bạn có thể phải thay đổi điều này nếu bạn sử dụng nhiều hoặc ít phân đoạn uri. Nếu bạn có các mức độ khác nhau của các thuật ngữ lồng nhau thì bạn sẽ cần phải viết một hàm để kiểm tra xem phân đoạn uri cuối cùng là loại bài đăng tùy chỉnh hoặc thuật ngữ phân loại để biết nên thêm quy tắc nào (hỏi tôi nếu bạn cần trợ giúp cái đó).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
$newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]';
return array_merge($newRules, $rules);
}
Sau đó, bạn cần thêm mã này để cho phép xử lý cách xử lý %taxonomy_name%
trong cấu trúc sên viết lại kiểu bài đăng tùy chỉnh của bạn:
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'custom_post_type_name')
return $link;
if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
{
$link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Tôi đã tạo một chức năng tùy chỉnh dựa trên chính Wordpress get_category_parents
:
// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {
$chain = '';
$parent = &get_term($id, $taxonomy);
if (is_wp_error($parent)) {
return $parent;
}
if ($nicename)
$name = $parent -> slug;
else
$name = $parent -> name;
if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
$visited[] = $parent -> parent;
$chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
// nothing, can't get this working :(
} else
$chain .= $name . $separator;
return $chain;
}
Sau đó, bạn cần phải xóa permalinks của bạn (chỉ cần tải trang cài đặt permalinks của bạn).
Bây giờ mọi thứ 'nên' làm việc hy vọng! Hãy tạo một loạt các thuật ngữ phân loại và lồng chúng một cách chính xác, sau đó tạo một số bài đăng loại bài tùy chỉnh và phân loại chúng một cách chính xác. Bạn cũng có thể tạo một trang với sên basename
và mọi thứ sẽ hoạt động theo cách tôi đã chỉ định trong câu hỏi của mình. Bạn có thể muốn tạo một số trang lưu trữ phân loại tùy chỉnh để kiểm soát cách chúng nhìn và thêm một số loại plugin tiện ích phân loại để hiển thị các danh mục lồng nhau của bạn trong thanh bên.
Mong rằng sẽ giúp bạn!