Cách tạo cấu trúc permalink với các nguyên tắc phân loại tùy chỉnh và các loại bài đăng tùy chỉnh như tên cơ sở / thuế cha mẹ / thuế trẻ em / tùy chỉnh sau loại tên


53

Tôi đã kết hợp trang web này và google để tìm câu trả lời và tôi đã hoàn toàn trống rỗng. Về cơ bản tôi muốn làm chính xác những gì bài đăng này yêu cầu, nhưng tôi cần một phân loại phân cấp. Câu trả lời được đưa ra trong bài đăng đó hoạt động rất tốt, nhưng chỉ với một nguyên tắc phân loại duy nhất. Có thể làm những gì tôi muốn? Tôi đã thử hàng triệu thứ, nhưng không có công việc nào, tốt nhất là tôi có thể có được permalinks đúng nhưng chúng xuất hiện 404.

Để minh họa trực quan những gì tôi muốn:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

Bạn có thể làm tốt điều này với các bài đăng và danh mục được xây dựng, làm thế nào để bạn làm điều đó với các phân loại tùy chỉnh và các loại bài tùy chỉnh? Tôi biết rằng bạn cần sử dụng 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),để có được các sên phân cấp, hoạt động tốt trên các trang lưu trữ, nhưng các bài đăng loại bài tùy chỉnh xuất hiện 404. Nếu tôi xóa 'hierarchical' => truephần đó thì các bài đăng hoạt động, nhưng tôi mất các url phân cấp (chỉ / tên cơ sở / cháu-mèo / tên / tác phẩm).

Vậy, giải pháp nào? Cảm ơn bạn rất nhiều, điều này đã khiến tôi phát điên trong khoảng 3 tuần nay.

Câu trả lời:


68

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àybà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.phptệ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' => truevà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 truetrong 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 basenamevà 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!


Đã sửa- xem câu hỏi. Jeff, cảm ơn lời giải thích của bạn! Nhưng bạn có thể đăng bài xây dựng posttype / taxonomy tùy chỉnh không? Vì vậy, tôi có thể thấy những gì tôi đang làm sai ? Sẽ thực sự cảm ơn!
Reitze Bos

Này Jeff, cảm ơn câu trả lời của bạn! Tôi đã gần đến nơi, sau 4 giờ chiến đấu với điều này. Vấn đề duy nhất của tôi là tôi nhận được một dấu gạch chéo kép trước tên bài đăng (như thế này: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Bạn có thể giúp tôi không?
Cmorales

1
@Cmorales, Không chắc chắn khi không nhìn thấy mã của bạn, nhưng hãy tìm một nơi bạn xác định thủ công dấu gạch chéo trước tên bài đăng của mình, như có thể là đăng ký sên cpt hoặc trong hàm filter_post_type? Nếu bạn không thể theo dõi nơi bạn thêm dấu gạch chéo thì bạn có thể loại bỏ ký tự cuối cùng khỏi giá trị được trả về của hàm get_taxonomy_parents được gọi trong bộ lọc_post_type_link, vì điều đó sẽ khiến bạn bị gạch chéo gấp đôi. Chúc may mắn.
Jeff

1
"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 về điều đó) ... "Chà, bạn có thể giúp tôi không? :)
Cmorales

2
^ Đó chính xác là những gì tôi cần. có ai biết làm thế nào không? xem câu hỏi của tôi ở đây: wordpress.stackexchange.com/questions/102246/iêu
reikyoushin

2

Hãy xem plugin này . Nó cung cấp các URL phân cấp cho các danh mục, nhưng bạn có thể dễ dàng thích nghi với mọi phân loại.

Việc tạo quy tắc tuân theo một hàm đệ quy .


2
Plugin này không còn có sẵn.
Enkode
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.