如何从永久链接结构中排除未分类/%CATEGORY%/%POSTNAME%/

时间:2014-02-05 作者:Scott B

我使用的是自定义permalink结构:

/%category%/%postname%/
因此,我的帖子如下所示:

mysite.com/widgets/blue-widget
只要“蓝色小部件”存在于一个且仅存在于一个类别中,这就可以正常工作。然而,当它出现在多个类别中时,例如可能是未分类的子类别,结果URL变成:

mysite.com/uncategorized/child-of-uncategorized/blue-widget
尽管这篇文章仍在“widgets”中,但似乎有一些东西让未分类的文章胜过了它。我相信是因为它的id较低。

我需要知道是否有可能排除未分类和任何未分类的孩子出现在permalink结构中。

UPDATED EXAMPLE:

因此,如果一篇文章分为3类,例如:

小部件(parent\\u id=0)、未分类(parent\\u id=0)、未分类的子部件(parent\\u id=1)

我希望过滤器使用“Widgets”作为永久链接slug,并排除“uncategorized”及其所有子级。

如果帖子属于2个或更多未分类的类别或未分类的子类别,那么只需使用最新的类别作为permalink slug。

如果帖子仅分配给未分类或其子级,则不要显示类别slug permalink

1 个回复
SO网友:Salem Terrano

我希望这对你有用:D

function mf_post_link( $permalink, $post, $leavename ) {
  if( $post->post_type != \'post\' ) return $permalink;

  // if no category, the filter is deactivated
  $cats = get_the_category($post->ID);
  if( ! count($cats) ) return $permalink;

  usort($cats, \'_usort_terms_by_ID\'); // order by ID
  $category_object = apply_filters( \'post_link_category\', $cats[0], $cats, $post );

  $category_object = get_term( $category_object, \'category\' );
  $parent = $category_object->parent;

  // if no father, the filter is deactivated
  if ( !$parent ) return;
  $category_parent = get_term( $parent, \'category\' );

  // if the parent is not uncategorized, the filter is deactivated
  if( $category_parent->slug != \'uncategorized\' ) return $permalink;

  return str_replace(\'uncategorized/\', \'\', $permalink);

}
add_filter( \'post_link\', \'mf_post_link\', 9, 3 );
编辑:

如果帖子是“未分类”类别或“未分类”的子类别作为主类别,请将“/%category%/%postname%”的永久链接规则更改为“/%postname%”

function my_pre_post_link( $permalink, $post, $leavename ) {
  if( $post->post_type != \'post\' ) return $permalink;
  $cats = get_the_category($post->ID);
  if( ! count($cats) ) return $permalink;

  usort($cats, \'_usort_terms_by_ID\');
  $category_object = apply_filters( \'post_link_category\', $cats[0], $cats, $post );

  $category_object = get_term( $category_object, \'category\' );

  return _clear_uncategorized($category_object, $permalink);
}

function _clear_uncategorized($cat, $permalink) {
  if( $cat->slug == \'uncategorized\' ) {
    return str_replace(\'%category%/\', \'\', $permalink);
  }
  $parent = $cat->parent;
  if ( !$parent )
    return $permalink;
  return _clear_uncategorized($parent, $permalink);
}

add_filter( \'pre_post_link\', \'my_pre_post_link\', 9, 3 );

结束