Как убрать слаг таксономии из URL кастомной таксономии, категории или тега

02.04.2017

Задача такая:

Есть у нас кастомные категории для стандартных типов записи (post), называется она Product Category – то есть помимо категории записи, у нас есть еще кастомная категория Product Category. Проблема в том, что при создании категорий в Product Category, например Bosh, то выводиться эта категория будет в таком формате:

site.ua/product_cat/bosh/

Наша задача избавиться от слага /product_cat/.

Стандартными плагинами это сделать не получилось, много нерабочих решений было найдено в Сети. Одно из решений здесь делало рабочей ссылку без слага, но все же при переходе из админки перекидывало на урл со слагом.

Самое идеальное и рабочее решение было найдено на сайте rudrastyh.com. Далее сделаю копипаст с вольным переводом.

В этом посте я покажу вам, как удалить «category» из URL категорий WordPress,

как удалить «tag» из URL тегов публикации

и как удалить слаг кастомных категорий («product_cat») из URL-адресов:

Вот основная часть Кода, вы можете вставить его в свою текущую тему functions.php, только не забудьте изменить названия таксономий/слагов в каждой функции на свои собственные значения.

add_filter('request', 'rudr_change_term_request', 1, 1 );

function rudr_change_term_request($query){

  $tax_name = 'product_cat'; // specify you taxonomy name here, it can be also 'category' or 'post_tag'

  // Request for child terms differs, we should make an additional check
  if( $query['attachment'] ) :
    $include_children = true;
  $name = $query['attachment'];
  else:
    $include_children = false;
  $name = $query['name'];
  endif;


  $term = get_term_by('slug', $name, $tax_name); // get the current term to make sure it exists

  if (isset($name) && $term && !is_wp_error($term)): // check it here

  if( $include_children ) {
    unset($query['attachment']);
    $parent = $term->parent;
    while( $parent ) {
      $parent_term = get_term( $parent, $tax_name);
      $name = $parent_term->slug . '/' . $name;
      $parent = $parent_term->parent;
    }
  } else {
    unset($query['name']);
  }

  switch( $tax_name ):
  case 'category':{
        $query['category_name'] = $name; // for categories
        break;
      }
      case 'post_tag':{
        $query['tag'] = $name; // for post tags
        break;
      }
      default:{
        $query[$tax_name] = $name; // for another taxonomies
        break;
      }
      endswitch;

      endif;

      return $query;
    }

    add_filter( 'term_link', 'rudr_term_permalink', 10, 3 );

    function rudr_term_permalink( $url, $term, $taxonomy ){

  $taxonomy_name = 'product_cat'; // your taxonomy name here
  $taxonomy_slug = 'product_cat'; // the taxonomy slug can be different with the taxonomy name (like 'post_tag' and 'tag' )

  // exit the function if taxonomy slug is not in URL
  if ( strpos($url, $taxonomy_slug) === FALSE || $taxonomy != $taxonomy_name ) return $url;

  $url = str_replace('/' . $taxonomy_slug, '', $url);

  return $url;
}

И не забывайте о 301 редиректе со старых URL-адресов, это необходимо для SEO вашего сайта. (Я этот код не добавлял, потому как он вызывает небольшой конфликт, если слово-слаг, на который ставится редирект, встречается в названии таксономии, например new-product_cat-1, то оно удаляется и идет редирект на new--1).

//301 redirect
add_action('template_redirect', 'rudr_old_term_redirect');

function rudr_old_term_redirect() {

  $taxonomy_name = 'product_cat';
  $taxonomy_slug = 'product_cat';

  // exit the redirect function if taxonomy slug is not in URL
  if( strpos( $_SERVER['REQUEST_URI'], $taxonomy_slug ) === FALSE)
    return;

  if( ( is_category() && $taxonomy_name=='category' ) || ( is_tag() && $taxonomy_name=='post_tag' ) || is_tax( $taxonomy_name ) ) :

    wp_redirect( site_url( str_replace($taxonomy_slug, '', $_SERVER['REQUEST_URI']) ), 301 );
  exit();

  endif;
}

Код был протестирован с различными иерархическими и неиерархическими таксономиями и прекрасно работает с этими настройками постоянных ссылок (Permalink Settings) /%postname%/

В формате /%category%/%postname%/ код не работает и мы получаем 404 ошибку при переходе на таксономию.

Рекомендую к прочтению:

Комментарии (4) к “Как убрать слаг таксономии из URL кастомной таксономии, категории или тега”

  • Кристина

    Переход на третью категорию показывает 404 ((
    ссылка типо название_сайта/restoran-i-bar/menu/zavtraki/

    Ответить
    • Denis Creative

      Лучше этот код не использовать, он подходит только для единичных конкретных случаев, я по итогу в проекте решил задачу по другому, этот код оставил для примера, но с ним много нюансов.

      Ответить

Оставить комментарий