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

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

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

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

site.ua/product_cat/bosh/

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

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

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

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

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

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

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

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

Как убрать слаг таксономии из 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%/

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

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

Просмотров:

Добавить комментарий