62

我想从 WordPress URL 中删除类别和标签库。我遇到过其他使用插件的帖子和解决方案。我想远离插件并在functions.php中找到解决方案。这将防止任何未来的插件更新或 WordPress 默认文件被更改。

任何帮助,将不胜感激。谢谢!

到目前为止,我已经尝试过这些解决方案:

4

15 回答 15

73

如果/category/要从 url 中删除,请执行以下两个步骤:

  1. 转到设置>>永久链接并选择自定义并输入:/%category%/%postname%/
  2. 接下来将您的类别基础设置为.

保存它,您会看到您的 URL 更改为以下格式:http: //yourblog.com/quotes/

(来源: http: //premium.wpmudev.org/blog/daily-tip-quick-trick-to-remove-category-from-wordpress-url/

于 2014-01-03T19:21:35.860 回答
36

如果您使用Yoast SEO插件,请转到:

Search Appearance > Taxonomies > Category URLs.

并从中remove选择Strip the category base (usually /category/) from the category URL

关于标签删除我还没有找到任何解决方案。

于 2016-07-31T10:13:36.073 回答
19

虽然您将其视为解决方案,但该插件是迄今为止最简单和最一致的方法,它们不会更改任何 WordPress 默认文件。

http://wordpress.org/plugins/wp-no-category-base/

它已经有一年不需要更新了,所以它并没有在更新方面产生任何问题。

没有简单的手动解决方案可以完成所有这些,而不仅仅是从您自己的functions.php中复制插件所做的事情

  • 更好的和合乎逻辑的永久链接,例如 myblog.com/my-category/ 和 myblog.com/my-category/my-post/。
  • 简单的插件 - 几乎不会增加任何开销。
  • 开箱即用 - 无需设置。无需修改 WordPress 文件。
  • 不需要其他插件即可工作。
  • 与站点地图插件兼容。
  • 适用于多个子类别。
  • 适用于 WordPress 多站点。
  • 将旧的类别永久链接重定向到新的(301 重定向,有利于 SEO)。

另外,如果 WordPress 确实发生了变化,您将获得这样的好处,那么插件将被更新以工作,而您必须弄清楚如何自己修复自己的代码。

于 2013-07-23T04:32:44.043 回答
18
  1. 设置自定义结构:/%postname%/
  2. 设置类别基础: 。(点不 /)

  3. 节省。100% 正常工作。

于 2015-01-03T11:01:35.217 回答
5

而是把它放在你的functions.php中工作正常,没有重定向问题。

function fix_slash( $string, $type )
{
global $wp_rewrite;
if ( $wp_rewrite->use_trailing_slashes == false )
{
    if ( $type != 'single' && $type != 'category' )
        return trailingslashit( $string );

    if ( $type == 'single' && ( strpos( $string, '.html/' ) !== false ) )
        return trailingslashit( $string );

    if ( $type == 'category' && ( strpos( $string, 'category' ) !== false ) )
    {
        $aa_g = str_replace( "/category/", "/", $string );
        return trailingslashit( $aa_g );
    }
    if ( $type == 'category' )
        return trailingslashit( $string );
}
return $string;
}

add_filter( 'user_trailingslashit', 'fix_slash', 55, 2 );
于 2014-12-19T15:35:48.760 回答
3

点技巧可能会破坏您的 RSS 提要和/或分页。但是,这些工作:

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_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]';
    return $category_rewrite;
}

// remove tag base
add_filter('tag_rewrite_rules', 'no_tag_base_rewrite_rules');
function no_tag_base_rewrite_rules($tag_rewrite) {
    $tag_rewrite=array();
    $tags=get_tags(array('hide_empty'=>false));
    foreach($tags as $tag) {
        $tag_nicename = $tag->slug;
        if ( $tag->parent == $tag->tag_ID )
            $tag->parent = 0;
        elseif ($tag->parent != 0 )
            $tag_nicename = get_tag_parents( $tag->parent, false, '/', true ) . $tag_nicename;
        $tag_rewrite['('.$tag_nicename.')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?tag=$matches[1]&feed=$matches[2]';
        $tag_rewrite['('.$tag_nicename.')/page/?([0-9]{1,})/?$'] = 'index.php?tag=$matches[1]&paged=$matches[2]';
        $tag_rewrite['('.$tag_nicename.')/?$'] = 'index.php?tag=$matches[1]';
    }
    global $wp_rewrite;
    $old_base = $wp_rewrite->get_tag_permastruct();
    $old_base = str_replace( '%tag%', '(.+)', $old_base );
    $old_base = trim($old_base, '/');
    $tag_rewrite[$old_base.'$'] = 'index.php?tag_redirect=$matches[1]';
    return $tag_rewrite;
}

// remove author base
add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules');
function no_author_base_rewrite_rules($author_rewrite) { 
    global $wpdb;    
    $author_rewrite = array();    
    $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users");    
    foreach($authors as $author) {
        $author_rewrite["({$author->nicename})/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$"] = 'index.php?author_name=$matches[1]&feed=$matches[2]';
        $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]';
        $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]';
    }      
    return $author_rewrite;}
add_filter('author_link', 'no_author_base', 1000, 2);
function no_author_base($link, $author_id) {
    $link_base = trailingslashit(get_option('home'));
    $link = preg_replace("|^{$link_base}author/|", '', $link);
    return $link_base . $link;
}
于 2016-08-08T20:04:56.510 回答
2

非类别插件对我不起作用。

对于多站点 WordPress,以下工作:

  1. 转到网络管理站点;
  2. 打开网站下\;
  3. 前往设置;
  4. 在永久链接结构类型下/%category%/%postname%/。这会将您的网址显示为www.domainname.com/categoryname/postname
  5. 现在转到您的站点仪表板(不是网络仪表板);
  6. 打开设置;
  7. 打开固定链接。不要保存(永久链接将显示不可编辑的字段为yourdoamainname/blog/。忽略它。如果您现在保存,您在步骤 4 中所做的工作将被覆盖。打开永久链接页面但不保存的这一步需要更新数据库。
于 2013-08-21T08:41:26.703 回答
2

如果您仍在搜索组合(基于 url 的标签、类别和页面),您可以像我一样进行操作。

使用 Wordpress 3.9.1 测试

如果您有相同名称的页面、类别或标签,系统将采取:

  1. 标签
  2. 类别
于 2014-07-08T16:18:33.917 回答
1

https://wordpress.org/plugins/remove-category-url/ 使用这个插件它可以完美地隐藏类别库它不需要任何设置,只需安装和激活。

于 2015-04-30T12:05:11.240 回答
1

我不知道如何使用代码来做到这一点,但对于那些不介意使用插件的人来说。这是一个对我有用的好方法:

https://es.wordpress.org/plugins/permalink-manager/

于 2019-07-02T21:39:24.437 回答
1

在永久链接中选择自定义结构并在您的域后添加 /%category%/%postname%/。将“/”添加到类别库中不起作用,您必须添加句点/点。我在这里写了一个教程:从 URL 教程中删除类别

于 2015-08-16T20:05:14.220 回答
-1

更新答案:

其他解决方案:
在 wp-includes/rewrite.php 文件中,您会看到代码:
$this->category_structure = $this->front . 'category/'; 只需复制整个函数,放入您的 functions.php 并挂钩它。只需将上面的行更改为:
$this->category_structure = $this->front . '/';

于 2015-04-13T17:18:40.420 回答
-1
add_action( 'init', 'remove_category_perma' );
function remove_category_perma() {
    unset($GLOBALS['wp_rewrite']->extra_permastructs['category']);
}
于 2018-11-15T07:25:25.227 回答
-1

WordPress 5.0.2:

要从现有帖子中删除类别 slug,请执行以下操作:

  1. 导航到设置>永久链接并将自定义结构从更改/%category%/%postname%/为:/%postname%/
  2. 保持类别和标签库为空(这也是默认设置)
  3. 节省

现在可以通过 直接访问所有帖子,domain.com/%postname%/并且可以通过 访问所有类别domain.com/category/xyz/。WordPress 将自动为旧网址添加所有 301 重定向。因此,如果有人访问domain.com/%category%/%postname%/,他们将自动被重定向到domain.com/%postname%/.

于 2019-01-03T10:43:25.893 回答
-3

添加“。” 如果您想要一个合并的博客视图,或“/”将不起作用。另外,我知道该解决方案会对 RSS 或 XML 提要做什么。我觉得坚持 WP 公约会更好。但是,我确实想出了一个更优雅的方法。

首先,我将基本类别 url 命名为“博客”

然后我创建了一个名为“all”的类别。最后,我将所有子类别都放在“全部”下。所以我得到了这样的 url 结构。

/blog - 404 - recommend 301 redirect to /blog/all/    
/blog/all/ -  all posts combined.
/blog/all/category1/ - posts filtered by category1
/blog/all/category2/ - posts filterer by category2

我在名为“博客”的菜单项上放置了一个自定义标签,但它转到了 blog/all。最好在 .htaccess 文件中将 /blog 301 重定向到 /blog/all 以避免 /blog 上的 404。

于 2015-07-20T09:13:47.120 回答