Come escludere la categoria non categorizzata dalla struttura dei permalink /%category%/%postname%/
Sto utilizzando una struttura personalizzata per i permalink:
/%category%/%postname%/
In modo che i miei articoli siano visualizzati come:
mysite.com/widgets/blue-widget
Questo funziona bene finché "blue-widget" esiste in una e una sola categoria. Tuttavia, quando appare in più di una categoria, ad esempio come figlio della categoria non categorizzata, l'URL risultante diventa:
mysite.com/uncategorized/child-of-uncategorized/blue-widget
Anche se l'articolo è ancora in "widgets", sembra che ci sia qualcosa che fa prevalere la categoria non categorizzata. Credo sia perché ha l'ID più basso.
Ho bisogno di sapere se è possibile escludere la categoria non categorizzata e tutti i suoi figli dalla struttura dei permalink.
ESEMPIO AGGIORNATO:
Quindi, se un articolo è in 3 categorie, ad esempio:
Widgets (parent_id=0), Non categorizzata (parent_id=0), Figlio della non categorizzata (parent_id=1)
Voglio che il filtro utilizzi "Widgets" come slug del permalink ed escluda "non categorizzata" e tutti i suoi figli.
Se l'articolo è in 2 o più categorie che non sono la non categorizzata o un suo figlio, allora usa semplicemente la categoria più recente come slug del permalink.
Se l'articolo è assegnato esclusivamente alla non categorizzata o a uno dei suoi figli, allora non mostrare uno slug di categoria nel permalink
Spero che questo funzioni per te :D
function mf_post_link( $permalink, $post, $leavename ) {
if( $post->post_type != 'post' ) return $permalink;
// se non c'è una categoria, il filtro è disattivato
$cats = get_the_category($post->ID);
if( ! count($cats) ) return $permalink;
usort($cats, '_usort_terms_by_ID'); // ordina per ID
$category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );
$category_object = get_term( $category_object, 'category' );
$parent = $category_object->parent;
// se non c'è un genitore, il filtro è disattivato
if ( !$parent ) return;
$category_parent = get_term( $parent, 'category' );
// se il genitore non è "uncategorized", il filtro è disattivato
if( $category_parent->slug != 'uncategorized' ) return $permalink;
return str_replace('uncategorized/', '', $permalink);
}
add_filter( 'post_link', 'mf_post_link', 9, 3 );
MODIFICA:
se il post appartiene alla categoria "uncategorized" o a una sua sottocategoria come categoria principale, cambia la regola del permalink da "/%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 Ci siamo quasi Salem. Rimuove "uncategorized", tuttavia, la sottocategoria di uncategorized è ancora presente.

Per favore aggiungi una spiegazione alla tua risposta: perché potrebbe risolvere il problema?

Non sono sicuro di cosa tu stia chiedendo ma, in sintesi, non voglio che "uncategorized" o nessuno dei suoi figli appaia nel permalink. La tua soluzione rimuove "uncategorized", ma non i suoi figli. In pratica vorrei un exclude_tree=1
