如何从类别分页中删除术语“类别”?

时间:2018-08-19 作者:Interessante Fakten

例如,我有一个类别/wiki/ https://buhehe.de/wiki/

它已从URL中删除了术语“类别”,但请参见:https://buhehe.de/wiki/page/2

它不显示第二个类别页面,但实际上有第二个页面。

问题出在哪里?

3 个回复
SO网友:Fayaz

为什么分页会出现问题

假设您有一个名为wiki.

现在,当您有如下类别URL时:https://example.com/wiki (而不是https://example.com/category/wiki) 并说出页面或帖子URL,如:

https://example.com/a-page
or
https://example.com/category-slug/a-post
WordPress真的无法知道https://example.com/wiki/page/2 是另一页/帖子的第二页,或类别存档的第二页(因为wiki 很可能是一个页眉或page 成为类别下的后鼻涕虫wiki).

这是因为WordPress与/page/2 作为不同部分multi-part paginated page or post.

因此,与其加载wiki 类别存档,WordPress将尝试加载带有slug的分页帖子page 你会得到404 (找不到页面)错误,而不是获取类别存档的第二页。

在我为您提供此问题的解决方案之前,首先确保您的永久链接是正确的。

要实现必要的类别URL结构:

您想要的URL结构需要一些工作。因此,除非您已经这样做了,否则请按照以下说明来实现上述URL结构:

# URL structure for Categories
https://example.com/category-slug
为此:

转到:WordPress Admin Panel MenuSettings..) 在Category base 文本字段


# URL structure for Posts
https://example.com/category-slug/post-slug
为此:

转到:WordPress Admin Panel MenuSettings.

  • 选择Custom Structure 并输入/%category%/%postname%/Custom Structure 文本字段

    解决类别分页问题:

    一些SEO插件可以解决这个问题。然而,由于这是站点的一个核心URL结构问题,因此最好不要依赖SEO插件。比如,如果你想在将来更改SEO插件,而另一个插件有更好的选项,但没有提供解决方案,该怎么办?

    因此,最好使用一个只解决这一个问题的简单插件。您可以使用以下代码并将其以文件名保存在插件目录中category-pagination-fix.php 然后激活名为Category Pagination Fix 从站点的管理面板:

    <?php
    /*
    Plugin Name:  Category Pagination Fix
    Plugin URI:   https://wordpress.stackexchange.com/a/311858/110572
    Description:  Fix category pagination
    Version:      1.0.0
    Author:       Fayaz Ahmed
    Author URI:   https://www.fayazmiraz.com/
    */
    
    function wpse311858_fix_category_pagination( $query_string = array() )
    {
        if( isset( $query_string[\'category_name\'] )
                && isset( $query_string[\'name\'] ) && $query_string[\'name\'] === \'page\'
                && isset( $query_string[\'page\'] ) ) {
            $paged = trim( $query_string[\'page\'], \'/\' );
            if( is_numeric( $paged ) ) {
                // we are not allowing \'page\' as a page or post slug 
                unset( $query_string[\'name\'] );
                unset( $query_string[\'page\'] )  ;
    
                // for a category archive, proper pagination query string  is \'paged\'
                $query_string[\'paged\'] = ( int ) $paged;
            }
        }   
        return $query_string;
    }
    add_filter( \'request\', \'wpse311858_fix_category_pagination\' );
    
    备选解决方案:当您有如下类别URL时,上述解决方案与分页完美结合:

    https://example.com/category-slug/
    
    并发布URL,如:

    https://example.com/category-slug/post-slug
    
    但是,如果您有子类别URL,如:

    https://example.com/category-slug/sub-category-slug
    
    或者,当您有类似以下的帖子URL时:

    https://example.com/post-slug
    
    上述简单的解决方案不起作用。

    在这种情况下,您可以使用如下插件Remove Category URL.

    这类插件会进行一些基本的URL重写更改,这就是为什么在您使用其中一个插件后,一些默认WordPress行为可能无法按预期工作的原因。所以,使用最适合你的解决方案,但要确保don\'t try to do the same thing in multiple different plugins.

    Caution: 使用这些类型的无头存档URL(例如category 或类似的分类页面链接,没有tag 或中的类似术语,用于标记页面链接等)会与页面产生内部冲突;发布URL。WordPress引擎需要进行大量的内部检查,以确定加载哪些,不加载哪些。这一进程需要大量资源。因此,如果你的网站有数千个页面、帖子、类别、标签等,最好在URL中使用这些术语。

  • SO网友:Cryptomanic

    Yoast插件-删除类别

    您可以使用SEO插件,如Yoast 有一个remove categories 选项,或者您可以自己编程该函数,下面的一些链接对此进行了解释。

    Some related posts that might help you:

    How to remove category from wordpress url?

    Remove category & tag base from WordPress url - without a plugin

    SO网友:norixxx

    这是我的解决方案。

    在我的情况下,这也适用于分页页面。

    请试一试,如果有用请告诉我。

    // Remove category from URL
    add_filter(\'user_trailingslashit\', \'wpse311858_remove_category_from_url\');
    function wpse311858_remove_category_from_url($link) {
      return str_replace("/category/", "/", $link);
    }
    
    // Add new category URLs
    add_filter(\'generate_rewrite_rules\', \'wpse311858_category_rewrite\');
    function wpse311858_category_rewrite($wp_rewrite) {
      $new_rules = [];
    
      // Get all the categories including empty categories
      $cats = get_categories([\'exclude\' => 1, \'hide_empty\' => false ]); //exclude uncategorized catagory if there were 
    
      // Loop through each category to add new rules to core rewrite pattern
      foreach( $cats as $cat ) {
        $cat_nicename = $cat->slug;
    
        // Check if it is parent or child category
        if( $cat->parent !== 0 ) {
          $cat_nicename = get_category_parents( $cat->parent, false, \'/\', true ) . $cat_nicename;
        }
    
        // For each pattern
        $new_rules[\'(\' . $cat_nicename . \')/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\'] = \'index.php?category_name=$matches[1]&feed=$matches[2]\'; // for feed pattern
        $new_rules[\'(\' . $cat_nicename . \')/(.+?)/(feed|rdf|rss|rss2|atom)/?$\'] = \'index.php?category_name=$matches[1]&feed=$matches[2]\'; // for another feed pattern
        $new_rules[\'(\' . $cat_nicename . \')/(.+?)/embed/?$\'] = \'index.php?category_name=$matches[1]&embed=true\'; // for embed page
        $new_rules[\'(\' . $cat_nicename . \')/page/?([0-9]{1,})/?$\'] = \'index.php?category_name=$matches[1]&paged=$matches[2]\'; // for paged page
        $new_rules[\'(\' . $cat_nicename . \')/?$\'] = \'index.php?category_name=$matches[1]\'; // for category archive page
    
      } //endforeach
    
      // Finally add new rules
      $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    }
    

    结束

    相关推荐

    WP_DROPDOWN_CATEGORIES-如何在Widget中保存?

    我想用wp_dropdown_categories 在自定义小部件中。所有内容都显示得很好,但由于某些原因,无法正确保存。这是form() 和update() 小部件的功能-我做错什么了吗?public function form( $instance ) { /* Set up some default widget settings. */ $defaults = array( \'title\' => \'Classes by Category\' );&#x