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.php
pliku.
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' => true
do tablicy przepisywania taksonomii, aby uzyskać zagnieżdżone terminy w adresie URL. Upewnij się również, że w obu przypadkach query_var
jest ustawiona true
opcja.
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 basename
i 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!