Поєднавши купу частин інших відповідей, я зрозумів, що це працює! Тож ось рішення для тих, хто бореться з цим:
Цей пост і цей допоміг мені дещо, тому дякую цим хлопцям.
Зауважте, весь цей код, а також ваш початковий спеціальний тип пошти та код реєстрації таксономії functions.php
зберігається у вашому файлі.
По-перше, правильно визначте свої мовчки, визначаючи свої власні типи публікацій та систематики: для користувацького типу пошти він повинен бути, basename/%taxonomy_name%
а шліф для вашої таксономії повинен бути справедливим basename
. Не забудьте також додати 'hierarchical' => true
до масиву переписання таксономії, щоб отримати вкладені терміни у своєму URL. Також переконайтеся, що query_var
встановлено true
в обох випадках.
Вам потрібно додати нове правило перезапису, щоб WordPress знав, як інтерпретувати структуру вашої URL-адреси. У моєму випадку частина користувальницької частини типу uri завжди буде п'ятим сегментом урі, тому я відповідно визначив своє правило відповідності. Зауважте, що вам, можливо, доведеться це змінити, якщо ви використовуєте більш-менш сегменти урі. Якщо у вас є різні рівні вкладених термінів, вам потрібно буде написати функцію, щоб перевірити, чи є останній сегмент урі спеціальним типом пошти чи терміном таксономії, щоб знати, яке правило додати (запитайте, чи потрібна вам допомога по що).
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);
}
Тоді вам потрібно додати цей код, щоб дозволити робочому натиснути, як поводитись %taxonomy_name%
у вашому користувальницькому структурі типу перепишіння тексту pug :
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);
Я створив власну функцію на основі власного 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;
}
Тоді вам потрібно змити свої постійні посилання (просто завантажте сторінку налаштувань постійних посилань).
Тепер все "повинно" працювати сподіваюсь! Ідіть, зробіть купу термінів таксономії та вставте їх правильно, а потім створіть кілька спеціальних публікацій типу публікацій та правильно їх класифікуйте. Ви також можете зробити сторінку зі слизом basename
, і все повинно працювати так, як я вказав у своєму запитанні. Ви можете створити деякі власні сторінки архіву систематики таксономії, щоб контролювати, як вони виглядають, і додати якийсь плагін віджетів таксономії, щоб показати вкладені категорії на бічній панелі.
Сподіваюся, що вам допоможе!