Cómo excluir sin categorizar de la estructura de permalink /% category% /% postname% /

4

Estoy usando una estructura de enlace permanente personalizada:

/%category%/%postname%/

Para que mis publicaciones aparezcan como:

mysite.com/widgets/blue-widget

Esto funciona bien siempre y cuando exista "blue-widget" en una y solo una categoría. Sin embargo, cuando aparece en más de una categoría, como tal vez un niño sin categorizar, la URL resultante se convierte en:

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

A pesar de que la publicación aún se encuentra en "widgets", parece que hay algo que hace que la categoría no supere. Creo que es porque tiene la identificación más baja.

Necesito saber si es posible excluir las categorías sin categoría y cualquier elemento secundario de sin categoría que aparezca en la estructura de enlace permanente.

EJEMPLO ACTUALIZADO:

Entonces, si una publicación está en 3 categorías por ejemplo:

Widgets (parent_id = 0), Sin categorizar (parent_id = 0), Hijo de Uncategorized (parent_id = 1)

Quiero que el filtro use "Widgets" como la barra de enlace permanente y excluye "sin categorizar" y todos sus hijos.

Si la publicación está en 2 o más categorías que no están sin categorizar o un niño sin categorizar, entonces solo usa la categoría más nueva como la slug permalink.

Si la publicación se asigna únicamente a sin categorizar o a uno de sus hijos, entonces no muestre una categoría slug enlace permanente

    
pregunta Scott B 05.02.2014 - 23:50

1 respuesta

1

Espero que esto te funcione: 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:

si la publicación es categoría "no categorizada" o hijo de "no categorizada" como categoría principal, cambie la regla de enlace permanente de "/% category% /% postname%" a "/% 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 );
    
respondido por el Salem Terrano 06.02.2014 - 03:11

Lea otras preguntas en las etiquetas