Cum să excludi categoria "Necategorizat" din structura permalink /%category%/%postname%/
Folosesc o structură personalizată de permalink:
/%category%/%postname%/
Astfel încât articolele mele să apară astfel:
mysite.com/widgets/blue-widget
Aceasta funcționează bine atâta timp cât "blue-widget" există într-o singură categorie. Totuși, când apare în mai multe categorii, cum ar fi o subcategorie a Necategorizat, URL-ul rezultat devine:
mysite.com/necategorizat/subcategorie-necategorizat/blue-widget
Chiar dacă articolul este tot în "widgets", se pare că există ceva care face ca Necategorizat să aibă prioritate. Cred că este din cauza că are ID-ul mai mic.
Am nevoie să știu dacă este posibil să exclud categoria Necategorizat și toate subcategoriile sale din structura permalink.
EXEMPLU ACTUALIZAT:
Deci, dacă un articol este în 3 categorii, de exemplu:
Widgets (parent_id=0), Necategorizat (parent_id=0), Subcategorie Necategorizat (parent_id=1)
Vreau ca filtrul să folosească "Widgets" ca slug în permalink și să excludă "necategorizat" și toate subcategoriile sale.
Dacă articolul este în 2 sau mai multe categorii care nu sunt Necategorizat sau o subcategorie a acesteia, atunci folosește cea mai nouă categorie ca slug în permalink.
Dacă articolul este atribuit doar categoriei Necategorizat sau uneia dintre subcategoriile sale, atunci nu afișa un slug de categorie în permalink.

Sper că acest lucru va funcționa pentru tine :D
function mf_post_link( $permalink, $post, $leavename ) {
if( $post->post_type != 'post' ) return $permalink;
// dacă nu există categorie, filtrul este dezactivat
$cats = get_the_category($post->ID);
if( ! count($cats) ) return $permalink;
usort($cats, '_usort_terms_by_ID'); // ordonează după ID
$category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );
$category_object = get_term( $category_object, 'category' );
$parent = $category_object->parent;
// dacă nu există părinte, filtrul este dezactivat
if ( !$parent ) return;
$category_parent = get_term( $parent, 'category' );
// dacă părintele nu este "necategorizat", filtrul este dezactivat
if( $category_parent->slug != 'uncategorized' ) return $permalink;
return str_replace('uncategorized/', '', $permalink);
}
add_filter( 'post_link', 'mf_post_link', 9, 3 );
EDIT:
dacă postul este în categoria "necategorizat" sau copil al categoriei "necategorizat" ca categorie principală, modifică regula permalink-ului de la "/%category%/%postname%" la "/%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 Aproape ai reușit Salem. Elimină "uncategorized", totuși, subcategoria din uncategorized este încă prezentă.

Te rog adaugă o explicație la răspunsul tău: de ce ar putea rezolva această problemă?

Nu sunt sigur ce întrebi, dar, pe scurt, nu vreau ca "necategorizat" sau oricare dintre copiii săi să apară în permalink. Soluția ta elimină "necategorizat", dar nu și copiii săi. Practic vreau un exclude_tree=1
