Cómo excluir "uncategorized" de la estructura de enlaces permanentes /%category%/%postname%/

6 feb 2014, 00:50:54
Vistas: 3.97K
Votos: 4

Estoy usando una estructura personalizada de enlaces permanentes:

/%category%/%postname%/

Para que mis posts se muestren así:

misitio.com/widgets/widget-azul

Esto funciona bien siempre que "widget-azul" exista en una sola categoría. Sin embargo, cuando aparece en más de una categoría, como por ejemplo una subcategoría de "uncategorized", la URL resultante se convierte en:

misitio.com/uncategorized/hijo-de-uncategorized/widget-azul

Aunque el post siga estando en "widgets", parece que hay algo que hace que "uncategorized" tenga prioridad. Creo que es porque tiene el ID más bajo.

Necesito saber si es posible excluir "uncategorized" y cualquier subcategoría de "uncategorized" de aparecer en la estructura de enlaces permanentes.

EJEMPLO ACTUALIZADO:

Si un post está en 3 categorías, por ejemplo:

Widgets (parent_id=0), Uncategorized (parent_id=0), Child of Uncategorized (parent_id=1)

Quiero que el filtro use "Widgets" como slug del enlace permanente y excluya "uncategorized" y todas sus subcategorías.

Si el post está en 2 o más categorías que no sean "uncategorized" o una subcategoría de "uncategorized", entonces simplemente usar la categoría más reciente como slug del enlace permanente.

Si el post está asignado únicamente a "uncategorized" o una de sus subcategorías, entonces no mostrar un slug de categoría en el enlace permanente.

2
Comentarios

Podrías cambiar la categoría sin categorizar por otro nombre.

Brad Dalton Brad Dalton
6 feb 2014 10:40:12

@Brad, está bien pero los hijos de sin categorizar seguirán mostrándose. No quiero ningún slug de publicación multinivel más allá de la categoría de nivel superior.

Scott B Scott B
6 feb 2014 16:46:55
Todas las respuestas a la pregunta 1
8

Espero que esto funcione para ti :D

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

  // si no hay categoría, se desactiva el filtro
  $cats = get_the_category($post->ID);
  if( ! count($cats) ) return $permalink;

  usort($cats, '_usort_terms_by_ID'); // ordenar por ID
  $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );

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

  // si no hay padre, se desactiva el filtro
  if ( !$parent ) return;
  $category_parent = get_term( $parent, 'category' );

  // si el padre no es "uncategorized", se desactiva el filtro
  if( $category_parent->slug != 'uncategorized' ) return $permalink;

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

}
add_filter( 'post_link', 'mf_post_link', 9, 3 );

EDITADO:

si el post está en la categoría "uncategorized" o es hijo de "uncategorized" como categoría principal, cambia la regla del permalink 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 );
6 feb 2014 04:11:41
Comentarios

+1 Casi lo logras Salem. Elimina "uncategorized", sin embargo, la categoría hija de uncategorized todavía está presente.

Scott B Scott B
6 feb 2014 06:41:46

Por favor agrega una explicación a tu respuesta: ¿por qué podría eso resolver el problema?

fuxia fuxia
6 feb 2014 08:57:25

Scott B, dime, ¿cómo quieres que quede la URL?

Salem Terrano Salem Terrano
6 feb 2014 13:08:42

Lo siento, mi inglés es falso. Dime, ¿cómo quiere la URL?

Salem Terrano Salem Terrano
6 feb 2014 16:22:03

Mira la actualización que publiqué al final de mi pregunta.

Scott B Scott B
6 feb 2014 16:36:28

¿si ese hijo tiene solo una categoría de sin categorizar?

Salem Terrano Salem Terrano
6 feb 2014 16:57:58

No estoy seguro de lo que estás preguntando pero, en resumen, no quiero que "uncategorized" o cualquiera de sus hijos aparezcan en el permalink. Tu solución elimina "uncategorized", pero no sus hijos. Básicamente quiero un exclude_tree=1

Scott B Scott B
6 feb 2014 17:44:17

Para mí esto funcionó y muestra el enlace correcto en el panel de administración. Pero cuando visito la página solo aparece el encabezado y el pie de página. Falta el contenido. ¿Alguna ayuda? Soy nuevo en WordPress

Rahul Sagore Rahul Sagore
2 ene 2018 14:15:56
Mostrar los 3 comentarios restantes