Cómo excluir "uncategorized" de la estructura de enlaces permanentes /%category%/%postname%/
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.

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 );

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

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

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
