После объединения кучки других ответов я получил это работает! Так что вот решение для тех из вас, кто тоже борется с этим:
Этот пост и этот помог мне немного, так что спасибо этим парням.
Обратите внимание, что весь этот код, а также ваш первоначальный тип записи и код регистрации таксономии находятся в вашем functions.php
файле.
Во-первых, правильно определите слагов при определении своих пользовательских типов постов и таксономий: для этого типа постов это должно быть, basename/%taxonomy_name%
а слаг для вашей таксономии должен быть просто basename
. Не забудьте также добавить 'hierarchical' => true
в массив переписывания таксономии, чтобы получить вложенные термины в вашем URL. Также убедитесь, что query_var
установлено true
в обоих случаях.
Вам нужно добавить новое правило перезаписи, чтобы WordPress знал, как интерпретировать вашу структуру URL. В моем случае пользовательский тип записи в URI всегда будет 5-м сегментом URI, поэтому я определил свое правило соответствия соответствующим образом. Обратите внимание, что вам, возможно, придется изменить это, если вы используете больше или меньше сегментов URI. Если у вас будут разные уровни вложенных терминов, вам нужно написать функцию, чтобы проверить, является ли последний сегмент 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);
}
Затем вам нужно добавить этот код, чтобы позволить workpress, как обрабатывать %taxonomy_name%
в вашей пользовательской структуре записей переписывать слаг:
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
, и все должно работать так, как я указал в своем вопросе. Возможно, вы захотите создать несколько пользовательских страниц архива таксономии, чтобы контролировать их внешний вид, и добавить какой-нибудь плагин виджета таксономии, чтобы отображать вложенные категории на боковой панели.
Надеюсь, что это поможет вам!
Взгляните на этот плагин . Он предоставляет иерархические URL для категорий, но вы можете легко адаптироваться к любой таксономии.
Создание правила следует за рекурсивной функцией .
источник