Как перехватить генерацию ссылок в WP?

Здравствуйте!
Суть вопроса: есть генерируемые системой ссылки (например, ссылка на категорию). Допустим, это
/category/cat/post
Я хочу, чтобы ссылки на страницах и в хлебных крошках выглядели как
/sometext/post
(это не собственно цель, а лишь гипотетический пример)

Соответствующие правила (чтобы /sometext/post открывался корректно) я уже добавил через нативный rewrite api. Но проблема в том, что даже после добавления нового правила и удаления старого (с category) ссылки на страницах остаются неизменными и ведут не туда. И я пока не нашел способа повлиять на это посредством хуков и фильтров.

Собственно, вопрос - как перезаписать не только rewrite rule, но и ссылку?..

Спасибо.
  • Вопрос задан
  • 2617 просмотров
Решения вопроса 2
VirmarY
@VirmarY
Full-stack web developer
Может это вам поможет - тык
Ответ написан
Комментировать
arizona
@arizona
а что я, собственно, здесь делаю?...
Для удаления префикса категории я использовала такое:
вмешивалась сначала в wp_rewrite, а потом в генерацию ссылок на категорию
Правила надо было создавать каждый раз при создании новой категории.
<?php
add_filter('category_link', 'no_category_parents',1000,2);
add_action('generate_rewrite_rules', 'my_rewrite_rules')

//Генерация перенаправления
function my_rewrite_rules( $wp_rewrite ) {
	$newCategoryLink = '%category%';
	$wp_rewrite->extra_permastructs['category']['struct'] = $newCategoryLink;

	$categories = get_terms(array('category'), array('hide_empty' => '0'));
	if( $categories ){
		foreach( $categories as $cat ){
			$catArr[] = $cat->slug;
		}
	}
	//Слить все названия категорий в конструкцию (кат1|кат2|кат3)
	$cat = implode('|', $catArr);
	//И перенаправлять на страницу категорий
	$rulesArr['('.$cat.')/?$'] = 'index.php?category_name=$matches[1]';
    $wp_rewrite->rules = $rulesArr + $wp_rewrite->rules;

//Работа с созданием ссылки на категорию
function no_category_parents($catlink, $category_id) {
    $category = get_category( $category_id );
    if ( is_wp_error( $category ) )
        return $category;
    $category_nicename = $category->slug;
	//Просто пишем новый формат ссылки без категории
    $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $category_nicename, 'category' );
	
    return $catlink;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы