web-dev-qa-db-fra.com

Commentaire exclure les non-classés de la structure permalien /% category% /% postname% /

J'utilise une structure personnalisée permalien:

/%category%/%postname%/

Alors que mes messages sont listés comme:

mysite.com/widgets/blue-widget

Cela fonctionne bien tant que "blue-widget" existe dans une et une seule catégorie. Cependant, lorsqu'il apparaît dans plus d'une catégorie, comme peut-être un enfant de non catégorisé, l'URL résultante devient:

mysite.com/uncategorized/child-of-uncategorized/blue-widget

Même si le message est toujours dans les "widgets", il semble qu'il y ait quelque chose qui fait que le non catégorisé le remplace. Je crois que c'est parce qu'il a l'identifiant inférieur.

J'ai besoin de savoir s'il est possible d'exclure les enfants non classés et les enfants non classés de la structure permalien.

EXEMPLE MISE À JOUR:

Donc, si un article est dans 3 catégories, par exemple:

Widgets (parent_id = 0), non catégorisé (parent_id = 0), enfant de non catégorisé (parent_id = 1)

Je veux que le filtre utilise "Widgets" comme lien permanent et exclue "sans catégorie" et tous ses enfants.

Si le message est dans 2 catégories ou plus qui ne sont pas non catégorisées ou un enfant de non catégorisé, utilisez simplement la catégorie la plus récente en tant que lien permanent.

Si le poste est attribué uniquement à un non-classé ou à l'un de ses enfants, alors n'affichez pas de lien permanent de catégorie.

4
Scott B

J'espère que cela fonctionnera pour vous: D

function mf_post_link( $permalink, $post, $leavename ) {
  if( $post->post_type != 'post' ) return $permalink;

  // if no category, the filter is deactivated
  $cats = get_the_category($post->ID);
  if( ! count($cats) ) return $permalink;

  usort($cats, '_usort_terms_by_ID'); // order by ID
  $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );

  $category_object = get_term( $category_object, 'category' );
  $parent = $category_object->parent;

  // if no father, the filter is deactivated
  if ( !$parent ) return;
  $category_parent = get_term( $parent, 'category' );

  // if the parent is not uncategorized, the filter is deactivated
  if( $category_parent->slug != 'uncategorized' ) return $permalink;

  return str_replace('uncategorized/', '', $permalink);

}
add_filter( 'post_link', 'mf_post_link', 9, 3 );

MODIFIER:

si le message correspond à la catégorie "non classé" ou à l'enfant de "non classé" en tant que catégorie principale, modifiez la règle de lien permanent de "/% category% /% postname%" en "/% 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
Salem Terrano