Структура постоянной ссылки WordPress для: страниц, сообщений и пользовательских типов записей - PullRequest
2 голосов
/ 13 февраля 2012

Я пытаюсь установить пользовательскую структуру постоянных ссылок для пользовательского типа записей на основе пользовательской таксономии родитель / потомок. Мне удалось этого добиться, но я нарушил структуру постоянных ссылок для страниц и сообщений.

Я выполнил следующее:

mysite.com / taxonomy_parent / taxonomy_child / postname

Другими словами, я удалил слаг таксономии, и 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 taxonomy в то же время, когда пользовательская структура постоянных ссылок для сообщений и страниц работает должным образом.

...