web-dev-qa-db-ja.com

カテゴリページネーションから「カテゴリ」という用語を削除するにはどうすればいいですか?

たとえば、カテゴリ/wiki/https://buhehe.de/wiki/があります。

URLから「カテゴリ」という用語が削除されましたが、こちらをご覧ください。https://buhehe.de/wiki/page/2

2番目のカテゴリページは表示されませんが、実際には2番目のページがあります。

問題はどこだ?

6

ページネーションの問題が起こるのはなぜですか?

wikiという名前のカテゴリがあるとします。

ここで、(https://example.com/wikiではなく)https://example.com/category/wikiのようなカテゴリURLがあり、次のようなページまたは投稿URLを言うと

https://example.com/a-page
or
https://example.com/category-slug/a-post

WordPressはhttps://example.com/wiki/page/2が別のページ/投稿の2ページ目なのか、カテゴリアーカイブの2ページ目なのかを実際に知る方法がありません(wikiがページslugかpageがカテゴリwikiの下のスラッグであるため)。

これはWordPressが/page/2の部分を別の 複数部分のページ付けされたページまたはポスト として混同しているために特に起こります。

そのため、wikiカテゴリアーカイブの次のページをロードする代わりに、WordPressはスラッグpageでページ分割された投稿をロードしようとし、カテゴリアーカイブの2ページ目を取得する代わりに404(page not found)エラーを受け取ります。

この問題の解決策を説明する前に、まずパーマリンクが正しいことを確認してください。

必要なカテゴリURL構造を実現するには

必要なURL構造にはいくつかの作業が必要です。それで、あなたがすでにそれをしていない限り、言われたURL構造を達成するために以下の指示に従ってください:

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

このため:

  1. WordPress Admin Panel MenuSettingsに移動します。
  2. .テキストフィールドに単一のドット(Category base)を入力します。
  3. クリック Save Changes ボタン。

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

このため:

  1. WordPress Admin Panel MenuSettingsに移動します。
  2. Custom Structureを選択し、/%category%/%postname%/テキストフィールドにCustom Structureを入力します。
  3. クリック Save Changes ボタン。

カテゴリページネーション問題の解決

いくつかのSEOプラグインはこの問題を解決します。しかし、これはあなたのサイトの中核となるURL構造の問題なので、これをSEOプラグインに頼らない方が良いでしょう。あなたが将来SEOプラグインを変更したいと思っていて、他のプラグインがより良いオプションを持っているが、これのための解決策を提供しないなら、どうしましょう?

したがって、この問題を1つだけ解決する単純なプラグインを使用することをお勧めします。次のコードを使用して、プラグインディレクトリにファイル名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

上記の簡単な解決策はうまくいきません。

このような場合、 カテゴリURLを削除する のようなプラグインを使用できます。

これらの種類のプラグインはいくつかの基本的なURL書き換えの変更を加えます、それであなたがこれらのプラグインの1つを使用した後にいくつかのデフォルトのWordPress動作が期待通りに働かないかもしれない理由です。ですから、自分に最適な解決策を使用してください。ただし、あなたが複数の異なるプラグインで同じことをやらないようにしてください

注意:この種のヘッドレスアーカイブURLを使用する(例:カテゴリページリンクにcategoryや類似の用語がない、タグページリンクにtagまたは類似の用語がないなど) 。)ページと投稿のURLとの内部的な衝突を引き起こします。 WordPressエンジンは、どれをロードし、どのロードしないかを決定するために多くの内部チェックを必要とします。そのプロセスはリソースを大量に消費します。そのため、サイトに何千ものページ、投稿、カテゴリ、タグなどがある場合は、URLにこれらの用語を使用することをお勧めします。

4
Fayaz

Yoast Plugin - カテゴリの削除

Yoast のようにSEOプラグインを使用することもできます。これには カテゴリの削除 というオプションがあります。

役に立つかもしれないいくつかの関連記事:

wordpressのURLからカテゴリを削除するには?

WordPressのURLからカテゴリとタグベースを削除 - プラグインなし

2
Cryptomanic

これが私の解決策です。

私の場合もこれはページ付けのあるページでも動作します。

試してみて、うまくいくかどうかを教えてください。

// 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;
}
0
norixxx