web-dev-qa-db-ja.com

未分類のパーマリンクから除外する方法/%category%/%postname%/

私はカスタムパーマリンク構造を使用しています:

/%category%/%postname%/

私の投稿は以下のようにリストされているので。

mysite.com/widgets/blue-widget

"blue-widget"が唯一のカテゴリに存在する限り、これはうまくいきます。ただし、カテゴリ化されていない子など、複数のカテゴリに表示される場合、結果のURLは次のようになります。

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

投稿がまだ「ウィジェット」に入っていても、未分類のものに勝るものがあるようです。私はそれが低いidを持っているのでそれを信じます。

未分類および未分類のすべての子をパーマリンク構造から除外することが可能かどうかを知る必要があります。

更新例:

たとえば、投稿が3つのカテゴリに属しているとします。

ウィジェット(parent_id = 0)、未分類(parent_id = 0)、未分類の子(parent_id = 1)

私はフィルタがパーマリンクスラッグとして "ウィジェット"を使用し、 "未分類"とそのすべての子を除外したいと思います。

投稿が未分類または未分類の子供の2つ以上のカテゴリに属する​​場合は、パーマリンクスラッグとして最新のカテゴリを使用してください。

投稿が未分類またはその子供の1人にのみ割り当てられている場合は、カテゴリスラッグパーマリンクを表示しないでください。

4
Scott B

私はこれがあなたのために働くことを願っています: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 );

編集:

投稿がカテゴリ "未分類"またはメインカテゴリとして "未分類"の子である場合は、 "/%category%/%postname%"のパーマリンクルールを "/%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