从 WordPress url 中删除类别和标签库 - 没有插件

Posted

技术标签:

【中文标题】从 WordPress url 中删除类别和标签库 - 没有插件【英文标题】:Remove category & tag base from WordPress url - without a plugin 【发布时间】:2013-07-21 20:26:04 【问题描述】:

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

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

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

此 htaccess 解决方案不起作用:http://mikepayne.co/2011/remove-category-base-from-url/ 这些方法也失败了:http://www.askapache.com/wordpress/remove-category-wordpress-urls.html

【问题讨论】:

你终于找到了一个很好的解决方案来从 url 中删除标签库吗? 【参考方案1】:

如果您想从网址中删除/category/,请按照以下两个步骤操作:

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

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

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

【讨论】:

最新版本的 WP (v.4,至少在我的情况下),似乎不允许为类别库设置 /。建议改用@Robbert 的答案。 在使用此解决方案时使用页面列出标记为给定类别的帖子时分页中断(WP 4.4.2,使用 . 作为类别库) 我可以确认这在处理分页时会在 4.6.1 中中断。 要从链接中删除/./,请使用此过滤器:add_filter( 'term_link', function($termlink) return str_replace('/./', '/', $termlink); , 10, 1 ); 这会破坏分页。当您尝试导航到 /page/2 时收到错误 404【参考方案2】:

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

Search Appearance > Taxonomies > Category URLs.

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

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

【讨论】:

自 2017 年 4 月 13 日起,执行此操作的“点”方法破坏了 Wordpress 4.6 及更高版本的许多功能。换句话说,它不再是一个可行的解决方案。然而,Yoast 毫不费力地做到了这一点。安装插件,启用该功能,它可以完美运行。另外,您可以获得一个很棒的插件来管理您的大量网站。赢赢! 还可能会添加“高级设置页面”需要在当前版本的插件的“功能”选项卡下启用。 但问题是如何在没有插件的情况下制作它? 那标签呢?? 在最新版本(测试版 9)中,此选项现在隐藏在 Search Appearance > Taxonomies > Category URLs 下。【参考方案3】:
    设置自定义结构:/%postname%/

    设置类别基础:。 (点不是 /)

    保存。 100% 正常工作。

【讨论】:

这会使类别消失,但如果我按下那个新链接,它会将我重定向到一个不存在的页面。为什么? 对我也不起作用——会破坏类别链接。我硬着头皮安装了插件。 这个解决方案破坏了我的页面并给我一个不存在的页面 这仅适用于帖子类别但带有标签,在遵循此指南后显示 404!【参考方案4】:

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

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

它已经有一年不需要更新了,所以它并没有造成任何更新问题。

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

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

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

【讨论】:

插件运行良好。我仍然有兴趣看到其他解决方案。 这里有一个更新的替代方案:Remove Category URL 网站上的插件过多会导致问题,并使使用 Wordpress 主题的版本控制(如 git)变得困难。因此,理想情况下,无需 Op 要求回答“没有插件” 插件不存在了【参考方案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 );

【讨论】:

很棒的解决方案无需插件!正是我需要的! 但是,上述内容似乎不适用于 子类别,尽管...例如。 www.site.com/main-category/sub-category/。返回 404 错误页面 @Robbert 为什么需要这个检查?:if ( $wp_rewrite->use_trailing_slashes == false )........ 对我没有任何帮助。【参考方案6】:

dot 技巧可能会破坏您的 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_baseauthor/|", '', $link);
    return $link_base . $link;

【讨论】:

你的functions.php文件 它打破了分页。 它破坏了主题,我应该添加什么吗?【参考方案7】:

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

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

    转到网络管理站点; 在\下打开站点; 进入设置; 在永久链接结构类型/%category%/%postname%/ 下。 这会将您的网址显示为www.domainname.com/categoryname/postname; 现在转到您的站点仪表板(不是网络仪表板); 打开设置; 打开永久链接。不要保存(永久链接将显示不可编辑字段为yourdoamainname/blog/。忽略它。如果您现在保存,您在步骤4中所做的工作将被覆盖。打开永久链接页面但不保存的这一步需要更新数据库。

【讨论】:

【参考方案8】:

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

打开永久链接设置并为类别和标签库 (https://premium.wpmudev.org/blog/removing-category-base-urls-wordpress/) 设置一个点 (.) 安装插件wp-no-tag-base

使用 Wordpress 3.9.1 测试

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

    标签 页面 类别

【讨论】:

【参考方案9】:

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

【讨论】:

问题是寻找“没有插件”的解决方案。【参考方案10】:

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

【讨论】:

这似乎不适用于子类别。你会得到一个 404。【参考方案11】:

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

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

【讨论】:

【参考方案12】:

更新答案:

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

【讨论】:

在 wp-includes 中更改文件是否明智?如果 WordPress 有更新,所有更改都将丢失。上面提到了一个使用functions.php的解决方案。 修改核心文件很少是您正在寻找的解决方案,因为核心开发人员可以随时修改和覆盖这些文件。 看起来答案已更新为不修改核心文件,只需将其复制到您自己的函数文件中即可。【参考方案13】:
add_action( 'init', 'remove_category_perma' );
function remove_category_perma() 
    unset($GLOBALS['wp_rewrite']->extra_permastructs['category']);

【讨论】:

FWIW,这并不能解决问题。这完全禁用(从 WP 5.7 开始)类别页面上的“友好”链接 URL。使用后我的分类页面变成了?cat=xx【参考方案14】:

WordPress 5.0.2:

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

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

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

【讨论】:

这没有回答问题;类别页面仍然使用 /category/term/ ...【参考方案15】:

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

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

然后我创建了一个名为“全部”的类别。最后,我将所有子类别都放在“全部”下。所以我得到了一个这样的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”的菜单项上放置了一个自定义标签,但它转到 blog/all。最好在 .htaccess 文件中将 /blog 301 重定向到 /blog/all 以避免 /blog 上的 404。

【讨论】:

以上是关于从 WordPress url 中删除类别和标签库 - 没有插件的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress - 从自定义帖子类型中删除子菜单

php 从WordPress管理区域的侧边菜单中隐藏本机类别和标签

php 从WordPress管理区域的侧边菜单中隐藏本机类别和标签

不能删除分类、标签! WordPress

如何从 wordpress 中删除“类别:[类别名称]”[关闭]

PHP 从Wordpress类别页面中删除RSS源