Cum să excludi categoria "Necategorizat" din structura permalink /%category%/%postname%/

6 feb. 2014, 00:50:54
Vizualizări: 3.97K
Voturi: 4

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.

2
Comentarii

Ați putea schimba denumirea categoriei "necategorizat" cu alt nume.

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

@Brad, bine, dar subcategoriile "necategorizat" vor fi în continuare afișate. Nu doresc să am slug-uri de articole pe mai multe niveluri dincolo de categoria de cel mai înalt nivel.

Scott B Scott B
6 feb. 2014 16:46:55
Toate răspunsurile la întrebare 1
8

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 );
6 feb. 2014 04:11:41
Comentarii

+1 Aproape ai reușit Salem. Elimină "uncategorized", totuși, subcategoria din uncategorized este încă prezentă.

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

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

fuxia fuxia
6 feb. 2014 08:57:25

Scott B, spune-mi, cum vrei să arate URL-ul?

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

Scuze, engleza mea este falsă. Spune-mi, cum se dorește URL-ul?

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

Vezi actualizarea pe care am postat-o la sfârșitul întrebării mele.

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

dacă acel copil are doar o categorie de neclasificat?

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

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

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

Pentru mine a funcționat și afișează linkul corect în panoul de administrare. Dar când vizitez pagina, există doar antetul și subsolul. Conținutul lipsește. Vreo ajutor? Sunt nou în WordPress

Rahul Sagore Rahul Sagore
2 ian. 2018 14:15:56
Arată celelalte 3 comentarii