带有叶类别的WordPress档案固定链接

时间:2018-07-21 作者:Jan

用%Category%设置的Wordpress类别存档永久链接包括完整的类别树。我只想看到URL中的叶子类别,而不是完整的树。

示例:

Wordpress Category: recipes > baking > bread
current permalink for archive: domain.com/recipes/baking/bread
desired permalink: domain.com/bread
我一直在网上搜索,不知道如何将这些更改挂接或过滤到我的wordpress代码中,所以非常欢迎任何想法和帮助。谢谢Jan

2 个回复
最合适的回答,由SO网友:Jan 整理而成

经过一番搜索,我找到了答案,以防其他人也有类似的问题。以下代码将只保留存档永久链接中最深的类别,并将删除所有父类别。

add_filter( \'category_link\', \'wpse7807_category_link\', 10, 2 );
function wpse7807_category_link( $catlink, $category_id )
{
    global $wp_rewrite;
    $catlink = $wp_rewrite->get_category_permastruct();

    if ( empty( $catlink ) ) {
        $catlink = home_url(\'?cat=\' . $category_id);
    } else {
        $category = &get_category( $category_id );
        $category_nicename = $category->slug;

        $catlink = str_replace( \'%category%\', $category_nicename, $catlink );
        $catlink = home_url( user_trailingslashit( $catlink, \'category\' ) );
    }
    return $catlink;
}
荣誉归于Changing the category permalink structure.

SO网友:Milo

您可以筛选term_link 修改API生成的任何分类URL。在这种情况下,我们只需要过滤器,因为默认重写规则将处理传入请求的这种修改。如果您正在进行任何引入新URL模式的更改,您还需要添加新规则或更改现有规则,以便这些新URL能够成功解析为正确的查询,而不仅仅是404。

如果你看看get_term_link API函数源,您将看到它检查是否为层次分类法的分支。我只是复制/粘贴了非层次结构的一些位,因此输出与非层次结构的项相同。

add_filter( \'term_link\', \'wpd_term_link_filter\', 10, 3 );
function wpd_term_link_filter( $url, $term, $taxonomy ) {
    if( \'category\' == $taxonomy ){
        global $wp_rewrite;
        $termlink = $wp_rewrite->get_extra_permastruct( $taxonomy );
        $termlink = str_replace( "%$taxonomy%", $term->slug, $termlink );
        $url = home_url( user_trailingslashit($termlink, \'category\') );
    }
    return $url;
}

结束