Jak utworzyć strukturę bezpośredniego połączenia z niestandardowymi systematykami i niestandardowymi typami postów, takimi jak nazwa-podstawy / podatek-rodzic / podatek-dziecko / nazwa-typu-post-nazwa

53

Przeczesuję tę stronę i google, by znaleźć odpowiedź i jestem zupełnie pusty. Zasadniczo chcę zrobić dokładnie to, o co posta ten post , ale potrzebuję hierarchicznej taksonomii. Odpowiedź podana w tym poście działa świetnie, ale tylko z jedną taksonomią jednego poziomu. Czy można robić, co chcę? Próbowałem miliona rzeczy, ale żadna nie działa, w najlepszym razie mogę uzyskać odpowiednie linki bezpośrednie, ale pojawiają się 404.

Aby zilustrować wizualnie to, czego chcę:

/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

Możesz to zrobić dobrze dzięki wbudowanym postom i kategoriom, jak to zrobić z niestandardowymi systematykami i niestandardowymi typami postów? Wiem, że musisz użyć, 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),aby uzyskać hierarchiczne ślimaki, które działają dobrze na stronach archiwum, ale niestandardowe posty typu pojawiają się 404. Jeśli usunę 'hierarchical' => trueczęść, posty działają, ale tracę hierarchiczne adresy URL (tylko / basename / grandchild-cat / post-name / works).

Jakieś rozwiązania? Dziękuję bardzo, to doprowadza mnie do szału już od około 3 tygodni.

Jeff
źródło

Odpowiedzi:

68

Po połączeniu wielu innych odpowiedzi, udało mi się! Oto rozwiązanie dla tych, którzy również borykają się z tym problemem:

Ten post i ten pomógł mi trochę, więc dzięki tym facetom.

Uwaga: cały ten kod, a także początkowy niestandardowy typ postu i kod rejestracji systematyki znajdują się w functions.phppliku.

Najpierw popraw swoje ślimaki podczas definiowania niestandardowych typów postów i taksonomii: dla niestandardowego typu postów powinien to być, basename/%taxonomy_name%a ślimak dla taksonomii powinien być sprawiedliwy basename. Nie zapomnij również dodać 'hierarchical' => truedo tablicy przepisywania taksonomii, aby uzyskać zagnieżdżone terminy w adresie URL. Upewnij się również, że w obu przypadkach query_varjest ustawiona trueopcja.

Musisz dodać nową regułę przepisywania, aby WordPress wiedział, jak interpretować strukturę adresu URL. W moim przypadku niestandardowym typem wpisu w uri zawsze będzie piąty segment uri, więc odpowiednio zdefiniowałem regułę dopasowania. Pamiętaj, że możesz to zmienić, jeśli używasz mniej lub więcej segmentów uri. Jeśli masz różne poziomy zagnieżdżonych terminów, musisz napisać funkcję, aby sprawdzić, czy ostatni segment uri jest niestandardowym typem postu lub terminem taksonomicznym, aby wiedzieć, którą regułę dodać (zapytaj, czy potrzebujesz pomocy w że).

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);
}

Następnie musisz dodać ten kod, aby umożliwić workpressowi sposób obsługi %taxonomy_name%niestandardowej struktury informacji o typie postu:

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);

Stworzyłem niestandardową funkcję opartą na własnej 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;    
}

Następnie musisz opróżnić permalinki (wystarczy załadować stronę ustawień permalinków).

Teraz mam nadzieję, że wszystko „powinno” działać! Stwórz kilka terminów taksonomii i zagnieżdż je poprawnie, a następnie zrób niestandardowe posty i odpowiednio je kategoryzuj. Możesz także utworzyć stronę ze ślimakiem basenamei wszystko powinno działać tak, jak podałem w moim pytaniu. Możesz utworzyć niestandardowe strony archiwum taksonomii, aby kontrolować ich wygląd, i dodać wtyczkę widgetu taksonomii, aby wyświetlić zagnieżdżone kategorie na pasku bocznym.

Mam nadzieję, że Ci pomoże!

Jeff
źródło
Naprawiono - patrz pytanie. Jeff, dziękuję za wyjaśnienie! Ale czy może być możliwe opublikowanie niestandardowej wersji posttype / taksonomii? Więc mogę zobaczyć, co robię źle ? Byłbym naprawdę wdzięczny!
Reitze Bos
Hej Jeff, dzięki za odpowiedź! Jestem prawie na miejscu, po 4 godzinach walki z tym. Moim jedynym problemem jest to, że dostaję podwójnego ukośnika przed nazwą postu (jako: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Czy możesz mi pomóc?
Cmorales,
1
@Cmorales, Nie jestem pewien, nie widząc twojego kodu, ale poszukaj miejsca, w którym ręcznie definiujesz ukośnik przed nazwą postu, na przykład rejestracja ślimaka cpt lub funkcja filter_post_type? Jeśli nie możesz wyśledzić, gdzie dodajesz dodatkowy ukośnik, możesz po prostu usunąć ostatni znak ze zwróconej wartości funkcji get_taxonomy_parents wywoływanej w filter_post_type_link, ponieważ to pozostawi cię z końcowym ukośnikiem, który jest pierwszym z podwójny. Powodzenia.
Jeff
1
„Jeśli masz różne poziomy zagnieżdżonych terminów, musisz napisać funkcję, aby sprawdzić, czy ostatni segment uri jest niestandardowym typem postu lub terminem taksonomicznym, aby wiedzieć, którą regułę dodać (zapytaj, czy potrzebujesz pomocy na to) ... „Cóż, możesz mi pomóc, proszę? :)
Cmorales
2
^ właśnie tego potrzebowałem. ktoś wie jak to zrobić? patrz moje pytanie tutaj: wordpress.stackexchange.com/questions/102246/…
reikyoushin
2

Spójrz na tę wtyczkę . Zapewnia hierarchiczne adresy URL dla kategorii, ale można łatwo dostosować się do dowolnej systematyki.

Tworzenie reguły odbywa się zgodnie z funkcją rekurencyjną .

vmassuchetto
źródło
2
Ta wtyczka nie jest już dostępna.
Enkode