Come escludere la categoria non categorizzata dalla struttura dei permalink /%category%/%postname%/

6 feb 2014, 00:50:54
Visualizzazioni: 3.97K
Voti: 4

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

2
Commenti

Potresti cambiare il nome della categoria "uncategorized" con un altro nome.

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

@Brad, va bene ma i figli di "uncategorized" verranno comunque visualizzati. Non voglio alcuno slug di articoli multilivello oltre la categoria di livello più alto.

Scott B Scott B
6 feb 2014 16:46:55
Tutte le risposte alla domanda 1
8

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

+1 Ci siamo quasi Salem. Rimuove "uncategorized", tuttavia, la sottocategoria di uncategorized è ancora presente.

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

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

fuxia fuxia
6 feb 2014 08:57:25

Scott B, dimmi, ¿ come vuoi che sia l'url ?

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

Scusa, il mio inglese è finto. Dimmi, come vuoi l'URL?

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

Vedi l'aggiornamento che ho pubblicato in fondo alla mia domanda.

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

se quel child ha solo una categoria di uncategorized?

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

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

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

Per me ha funzionato e mostra il link corretto nel pannello di amministrazione. Ma quando visito la pagina ci sono solo l'header e il footer. Il contenuto manca. Qualche aiuto? Sono nuovo su WordPress

Rahul Sagore Rahul Sagore
2 gen 2018 14:15:56
Mostra i restanti 3 commenti