Como excluir não categorizado da estrutura permalink /% category% /% postname% /

4

Estou usando uma estrutura personalizada de permalink:

/%category%/%postname%/

Para que minhas postagens sejam listadas como:

mysite.com/widgets/blue-widget

Isso funciona bem, desde que "blue-widget" exista em uma e somente uma categoria. No entanto, quando aparece em mais de uma categoria, como talvez um filho de não categorizado, o URL resultante se torna:

mysite.com/uncategorized/child-of-uncategorized/blue-widget

Embora a postagem ainda esteja em "widgets", parece que há algo que faz com que a categoria não categorizada a supere. Eu acredito que é porque tem o menor id.

Eu preciso saber se é possível excluir a falta de categorias e que qualquer filho de não categorizado apareça na estrutura do link permanente.

EXEMPLO ATUALIZADO:

Então, se uma postagem estiver em três categorias, por exemplo:

Widgets (parent_id = 0), Sem categoria (parent_id = 0), Filho de Uncategorized (parent_id = 1)

Eu quero que o filtro use "Widgets" como a sequência de links permanentes e excluir "não categorizado" e todos os seus filhos.

Se a postagem estiver em duas ou mais categorias que não sejam não categorizadas ou um filho de não categorizado, em seguida, basta usar a mais nova categoria como o permalink slug.

Se a postagem for atribuída somente a não categorizado ou a um de seus filhos, não exiba um link permanente de slug de categoria

    
por Scott B 05.02.2014 / 23:50

1 resposta

1

Espero que isso funcione para você: 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 );

EDITAR:

se o post for categoria "uncategorized" ou filho de "uncategorized" como a categoria principal, altere a regra permalink de "/% category% /% postname%" para "/% 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 );
    
por Salem Terrano 06.02.2014 / 03:11