固定链接结构中的筛选类别

时间:2010-11-15 作者:pax

使用/%category%/%postname%/ 对于permalink,我得到一个URL字符串,其中包含特定帖子所包含的所有类别。我希望url中的类别只被过滤到类别结构的一个分支,而不是从根父类别开始。

我有一个旅游博客,我有这样的分类结构:
places › countryName › regionName › cityName<例如:www.mytravelblog。com/places/indonesia/java/jakarta/myPostName/

我想跳过URL中的根目录,甚至只使用最小的子目录,例如www.mytravelblog。com/jakarta/myPostName

有可能吗?(WP 3.0.1)

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

这应该是可能的。首先,你很幸运www.mytravelblog.com/jakarta/myPostName/ 已经可以使用了,它会向您显示帖子,不会将您重定向到较长的版本(至少在我看来是可行的)。这意味着您只需处理生成的链接,而不必干扰传入URL的处理方式或“规范化”。

结果get_permalink(), 将通过post_link. 所以你可以这样做:

add_filter( \'post_link\', \'remove_parent_cats_from_link\', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename )
{
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Make sure we use the same start cat as the permalink generator
        usort( $cats, \'_usort_terms_by_ID\' ); // order by ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // If there are parent categories, collect them and replace them in the link
            $parentcats = get_category_parents( $parent, false, \'/\', true );
            // str_replace() is not the best solution if you can have duplicates:
            // myexamplesite.com/luxemburg/luxemburg/ will be stripped down to myexamplesite.com/
            // But if you don\'t expect that, it should work
            $permalink = str_replace( $parentcats, \'\', $permalink );
        }
    }
    return $permalink;
}

SO网友:Patrick S

我原以为我会对此发表评论,但那地方太小,无法具体说明细节。

简·法布里的回答很好!然而,他的缺点是,他甚至在评论中指出,如果你有一个像http://example.com/sports/world-sports/permalink, 它将被剥离为http://example.com/world-permalink, 这实际上会导致404。

为了避免这种情况,您可以添加

$parentcats = \'/\' . $parentcats;
所以应该是这样

$parentcats = \'/\'. $parentcats;
$permalink = str_replace( $parentcats, \'/\', $permalink );
这将只剥离/体育/而不是/世界体育/

希望它能帮助别人!

SO网友:conualfy

如果您在不同地区/国家有相同的地区/城镇名称,您会怎么做?

另一种方法是保留链接,但根据类别处理页面内容。你可以用这个:

<?php 
foreach((get_the_category()) as $childcat)
{
  if (cat_is_ancestor_of($my_cat_id, $childcat))
  {
    echo $child = $childcat->cat_name;
    //echo $parent = $childcat->category_parent;
  }
} 
?>

结束

相关推荐

An issue with SEO Ultimate

我正在使用SEO Ultimate。404监视器模块报告了几个404错误。报告不存在的URL的错误;其中有3本是草稿,但从未出版过。我查看了我的xml站点地图,但没有找到。此外,链接检查器不会显示任何断开的链接。有谁有过SEO旗舰版的经验,谁能为我指出正确的方向?谢谢