Я пытаюсь установить пользовательскую структуру постоянных ссылок для пользовательского типа сообщений на основе пользовательской таксономии родитель/дочерний элемент. Мне удалось добиться этого, но я нарушил структуру постоянных ссылок для страниц и сообщений.
Я выполнил следующее:
mysite.com/taxonomy_parent/taxonomy_child/имя_записи
Другими словами, я удалил ярлык таксономии, и URL-адрес показывает правильный иерархический порядок. Во-первых, я установил аргумент «переписать» при регистрации пользовательской таксономии и пользовательского типа записи:
для пользовательской таксономии:
'rewrite' => array( 'slug' => '', 'with_front' => false, 'hierarchical' => true ),
для типа поста:
'rewrite' => array( 'slug' => '%mytaxonomy%', 'with_front' => false, 'hierarchical' => true ),
Затем я добавил следующий код, чтобы получить поддержку для отображения родительской/дочерней таксономии в URL-адресе.
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['(.+)/(.+)/(.+)/?$'] = 'index.php?myposttype=$matches[3]';
$newRules['(.+)/?$'] = 'index.php?mytaxonomy=$matches[1]';
return array_merge($newRules, $rules);
}
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'myposttype')
return $link;
if ($cats = get_the_terms($post->ID, 'mytaxonomy'))
{
$link = str_replace('%mytaxonomy%', get_taxonomy_parents(array_pop($cats)->term_id, 'mytaxonomy', false, '/', true), $link);
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
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;
}
Это прекрасно работает, но возникает конфликт с настраиваемой постоянной ссылкой для сообщений и страниц. Мне тоже нужно настроить. На самом деле мне нужны «mysite.com/blog/category/postname» и «mysite.com/pagename». Так же просто, как установить пользовательскую постоянную ссылку, подобную этой, «/%category%/%postname%/» работает правильно, но возвращается страница ошибки 404, когда необходимая текущая конфигурация, которую я объяснил, установлена в моем functions.php
Я предполагаю, что есть проблема с rewrite_rules, но не знаю, как это исправить или как установить новые правила для поддержки моей пользовательской структуры постоянных ссылок post_type/custom таксономии, в то время как пользовательская структура постоянных ссылок для сообщений и страниц работает правильно.