Как исключить категорию "Без рубрики" из структуры постоянных ссылок /%category%/%postname%/

6 февр. 2014 г., 00:50:54
Просмотры: 3.97K
Голосов: 4

Я использую пользовательскую структуру постоянных ссылок:

/%category%/%postname%/

Таким образом, мои записи отображаются как:

mysite.com/widgets/blue-widget

Это работает нормально, пока "blue-widget" находится только в одной категории. Однако, если запись находится в нескольких категориях, включая подкатегории "Без рубрики", URL становится таким:

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

Хотя запись все еще находится в категории "widgets", кажется, что WordPress отдает приоритет категории "Без рубрики". Я предполагаю, что это происходит из-за более низкого ID этой категории.

Мне нужно узнать, возможно ли исключить категорию "Без рубрики" и все ее подкатегории из структуры постоянных ссылок.

ОБНОВЛЕННЫЙ ПРИМЕР:

Если запись находится в 3 категориях, например:

Widgets (parent_id=0), Uncategorized (parent_id=0), Child of Uncategorized (parent_id=1)

Я хочу, чтобы фильтр использовал "Widgets" как часть URL и исключал "uncategorized" и все ее подкатегории.

Если запись находится в 2 или более категориях, не относящихся к "Без рубрики", тогда нужно использовать самую новую категорию как часть URL.

Если запись назначена только в "Без рубрики" или ее подкатегорию, тогда не отображать категорию в URL.

2
Комментарии

Вы можете изменить название категории "Без категории" на другое.

Brad Dalton Brad Dalton
6 февр. 2014 г. 10:40:12

@Brad, хорошо, но дочерние элементы "Без категории" все равно будут отображаться. Я не хочу, чтобы в URL записи было больше одного уровня вложенности категорий.

Scott B Scott B
6 февр. 2014 г. 16:46:55
Все ответы на вопрос 1
8

Надеюсь, это сработает для вас :D

function mf_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'); // сортировка по ID
  $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );

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

  // если нет родителя, фильтр деактивируется
  if ( !$parent ) return;
  $category_parent = get_term( $parent, 'category' );

  // если родительская категория не "uncategorized", фильтр деактивируется
  if( $category_parent->slug != 'uncategorized' ) return $permalink;

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

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

РЕДАКТИРОВАНО:

если запись находится в категории "uncategorized" или является дочерней для "uncategorized" как основной категории, изменить правило ЧПУ с "/%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 );
6 февр. 2014 г. 04:11:41
Комментарии

+1 Почти получилось, Salem. Он убирает "uncategorized", однако дочерняя категория uncategorized всё ещё остаётся.

Scott B Scott B
6 февр. 2014 г. 06:41:46

Пожалуйста, добавь объяснение к своему ответу: почему это может решить проблему?

fuxia fuxia
6 февр. 2014 г. 08:57:25

Scott B, скажи, как ты хочешь, чтобы выглядел URL?

Salem Terrano Salem Terrano
6 февр. 2014 г. 13:08:42

Извините, мой английский ненастоящий. Скажите, как должен выглядеть URL?

Salem Terrano Salem Terrano
6 февр. 2014 г. 16:22:03

Смотрите обновление, которое я разместил в конце моего вопроса.

Scott B Scott B
6 февр. 2014 г. 16:36:28

если у этого дочернего элемента только одна категория "uncategorized"?

Salem Terrano Salem Terrano
6 февр. 2014 г. 16:57:58

Не уверен, что именно вы спрашиваете, но вкратце: я не хочу, чтобы рубрика "Без рубрики" или любые её дочерние рубрики отображались в постоянной ссылке. Ваше решение убирает "Без рубрики", но не её дочерние элементы. По сути, мне нужно что-то вроде exclude_tree=1

Scott B Scott B
6 февр. 2014 г. 17:44:17

У меня это сработало, и в админ-панели отображается правильная ссылка. Но когда я перехожу на страницу, отображаются только шапка и подвал. Контент отсутствует. Любая помощь? Я новичок в WordPress

Rahul Sagore Rahul Sagore
2 янв. 2018 г. 14:15:56
Показать остальные 3 комментариев