Удалить родительскую категорию из постоянных ссылок? Оставить только дочерние категории?

30 дек. 2010 г., 00:03:12
Просмотры: 18.4K
Голосов: 10

Раньше для этого существовал устаревший плагин. Есть ли способ сделать это легко с помощью небольшого кода? Мы предпочитаем не полагаться на плагины, так как это делает нас зависимыми от разработчика в плане обновлений.

У нас есть только две родительские категории, которые мы хотели бы удалить из постоянных ссылок для всех их дочерних категорий: "items" и "genres" (так что решение можно адаптировать для удаления только двух ID категорий)

Я видел решение для отдельных записей здесь, но не думаю, что оно работает и для постоянных ссылок категорий, не так ли?

0
Все ответы на вопрос 1
3

Этот код отлично справляется с задачей для данного вопроса и еще одного вопроса об удалении базового /category/ из постоянных ссылок. Я взял его из плагина, который это делает, и решил использовать просто исходный код.

Теперь постоянные ссылки содержат только самую нижнюю дочернюю категорию.

Раньше у нас было:

example.com/category/items/books/

а теперь...

example.com/books

Однако RSS-ленты, похоже, не работают с такими короткими URL и по-прежнему требуют длинных URL. (Не уверен, есть ли исправление для этого.) Также это не меняет постоянные ссылки записей. Изменяются только ссылки категорий. Вставьте код ниже в файл functions.php. Я использую WordPress 3.0+.

// Удаляем базовый префикс категории
add_filter('category_link', 'no_category_parents',1000,2);
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;
}

// Добавляем собственные правила перезаписи категорий
add_filter('category_rewrite_rules', 'no_category_parents_rewrite_rules');
function no_category_parents_rewrite_rules($category_rewrite) {
    //print_r($category_rewrite); // Для отладки

    $category_rewrite=array();
    $categories=get_categories(array('hide_empty'=>false));
    foreach($categories as $category) {
        $category_nicename = $category->slug;
        $category_rewrite['('.$category_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['('.$category_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['('.$category_nicename.')/?$'] = 'index.php?category_name=$matches[1]';
    }
    // Поддержка редиректа со старой базы категорий
    global $wp_rewrite;
    $old_base = $wp_rewrite->get_category_permastruct();
    $old_base = str_replace( '%category%', '(.+)', $old_base );
    $old_base = trim($old_base, '/');
    $category_rewrite[$old_base.'$'] = 'index.php?category_redirect=$matches[1]';

    //print_r($category_rewrite); // Для отладки
    return $category_rewrite;
}

// Добавляем переменную запроса 'category_redirect'
add_filter('query_vars', 'no_category_parents_query_vars');
function no_category_parents_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}
// Редирект если установлен 'category_redirect'
add_filter('request', 'no_category_parents_request');
function no_category_parents_request($query_vars) {
    //print_r($query_vars); // Для отладки
    if(isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option( 'home' )) . user_trailingslashit( $query_vars['category_redirect'], 'category' );
        status_header(301);
        header("Location: $catlink");
        exit();
    }
    return $query_vars;
}
30 дек. 2010 г. 00:53:59
Комментарии

Очень признателен за этот ответ, я искал решение больше 2 часов! Поделился этим с ребятами на wordpress.org, надеюсь, это поможет другим! http://wordpress.org/support/topic/perfect-permalink-possible?replies=4#post-2214102

User User
11 июл. 2011 г. 03:02:21

будет ли аналогичное решение работать для страниц? http://wordpress.stackexchange.com/questions/173048/does-a-parent-pages-post-title-have-to-appear-in-a-child-page-permalink

codecowboy codecowboy
23 дек. 2014 г. 10:17:15

Это изменило URL, но вызвало ошибку страница не найдена. :(

Debsmita Paul Debsmita Paul
1 сент. 2020 г. 13:39:45