WordPress를 사용하는 분들이라면 모두 아시겠지만, /category/ 제거 기능이 통합되지 않은 일부 테마에서는 고정 링크를 수정할 때마다 카테고리 링크에 /category/ 디렉터리가 나타납니다. 카테고리 링크에서 /category/ 디렉터리를 제거하려면 플러그인을 사용할 수 있습니다. 인터넷에도 이를 바로 제거해 주는 플러그인이 많이 있습니다(사실 많은 테마에는 이미 이 기능이 내장되어 있습니다). 하지만 오늘 소개해 드릴 것은 플러그인을 사용하기 싫어하는 분들에게 적합한 순수 코드 버전의 /category/ 제거 방법입니다.

PHP 코드

// 去除分类 category 的代码
add_action('load-themes.php', 'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
    global $wp_rewrite, $wp_version;
    if (version_compare($wp_version, '3.4', '<')) {
        $wp_rewrite->extra_permastructs['category'][0] = '%category%';
    } else {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    }
}
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
    $category_rewrite = array();
    $categories = get_categories(array('hide_empty' => false));
    foreach ($categories as $category) {
        $category_nicename = $category->slug;
        if ($category->parent == $category->cat_ID)
            $category->parent = 0;
        elseif ($category->parent != 0)
            $category_nicename = get_category_parents($category->parent, false, '/', true) . $category_nicename;
        $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_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    $old_category_base = trim($old_category_base, '/');
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
    return $category_rewrite;
}
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}
add_filter('request', 'no_category_base_request');
function no_category_base_request($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;
}

위 코드를 현재 사용 중인 테마의 functions.php 파일에 추가하고, 마지막 ?> 바로 앞에 넣으면 됩니다.

플러그인을 설치하든 코드를 사용하든 404 페이지 오류가 발생할 수 있으며, %post_id%.html(이 사이트에서 설정한 고정 링크)의 의사 정적 링크가 작동하지 않을 수 있습니다. 이런 경우에는 고정 링크 설정을 한 번 다시 저장하기만 하면 됩니다.