Задача такая:
Есть у нас кастомные категории для стандартных типов записи (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
Лучше этот код не использовать, он подходит только для единичных конкретных случаев, я по итогу в проекте решил задачу по другому, этот код оставил для примера, но с ним много нюансов.
Кристина
А тогда как Вы решили проблему с устранением в url product_cat ? ))
Denis Creative
Я задал для таксономии слаг “blog”
