Долгожданный пост!
Когда-то у меня уже была запись о том, как удалить слово «category» из URL рубрик, вот она. Это кстати был мой первый пост на блоге и, как оказалось, тот метод немного сыроват, работает не у всех и не всегда.
Сейчас я уже поколдовал над кодом сам и у меня получился метод, работающий не только для рубрик, но также для меток и произвольных таксономий.
Весь код будет состоять из двух частей, в первой часте мы собственно меняем ссылки и запросы на странице, а во второй — проставляем 301 редиректы со старых страниц на новые.
Итак, часть 1. Весь код можете вставлять в functions.php
вашей темы.
// смена запроса add_filter('request', 'true_smenit_request', 1, 1 ); function true_smenit_request( $query ){ $taxonomia_name = 'product_cat'; // укажите название таксономии здесь, это также могут быть рубрики category или метки post_tag // запросы для дочерних элементов будут отличаться, поэтому нам потребуется дополнительная проверка if( $query['attachment'] ) : $dochernia = true; // эту переменную задаём для себя, она нам потребуется дальше $urlyarlyk = $query['attachment']; // это ярлык данного термина/рубрики/метки else: $dochernia = false; $urlyarlyk = $query['name']; // как видите, здесь ярлык хранится в другой переменной запроса endif; $termin = get_term_by('slug', $urlyarlyk, $taxonomia_name); // получаем элемент таксономии по ярлыку if ( isset( $urlyarlyk ) && $termin && !is_wp_error( $termin )): // если такого элемента не существует, прекращаем выполнение кода // для страниц дочерних элементов код немного отличается if( $dochernia ) { unset( $query['attachment'] ); $parent = $termin->parent; while( $parent ) { $parent_term = get_term( $parent, $taxonomia_name); $urlyarlyk = $parent_term->slug . '/' . $urlyarlyk; // нам нужно получить полный путь, состоящий из ярлыка текущего элемента и всех его родителей $parent = $parent_term->parent; } } else { unset($query['name']); } switch( $taxonomia_name ): // параметры запроса для рубрик и меток отличаются от других таксономий case 'category':{ $query['category_name'] = $urlyarlyk; break; } case 'post_tag':{ $query['tag'] = $urlyarlyk; break; } default:{ $query[$taxonomia_name] = $urlyarlyk; break; } endswitch; endif; return $query; } // смена самой ссылки add_filter( 'term_link', 'true_smena_permalink', 10, 3 ); function true_smena_permalink( $url, $term, $taxonomy ){ $taxonomia_name = 'product_cat'; // название таксономии, тут всё понятно $taxonomia_slug = 'product_cat'; // ярлык таксономии - зависит от параметра rewrite, указанного при создании и может отличаться от названия, // как например таксономия меток это post_tag, а ярлык по умолчанию tag // выходим из функции, если указанного ярлыка таксономии нет в URL или если название таксономии не соответствует if ( strpos($url, $taxonomia_slug) === FALSE || $taxonomy != $taxonomia_name ) return $url; $url = str_replace('/' . $taxonomia_slug, '', $url); // если мы ещё тут, выполняем замену в URL return $url; }
Если вы добрались до сюда и у вас всё работает — отлично, можете переходить к следующему коду статьи.
Если же не работает, то:
Часть вторая, код 301 редиректа:
add_action('template_redirect', 'true_delaem_redirect'); function true_delaem_redirect() { // указываем здесь свои значения $taxonomia_name = 'product_cat'; $taxonomia_slug = 'product_cat'; // выходим из функции, если ярлыка таксономии нет в URL if( strpos( $_SERVER['REQUEST_URI'], $taxonomia_slug ) === FALSE) return; // делаем суперскую проверку, чтобы случайно не редиректнуть страницы, которые не следует if( ( is_category() && $taxonomia_name=='category' ) || ( is_tag() && $taxonomia_name=='post_tag' ) || is_tax( $taxonomia_name ) ) : wp_redirect( site_url( str_replace($taxonomia_slug, '', $_SERVER['REQUEST_URI']) ), 301 ); // сам редирект exit(); endif; }