たとえば、カテゴリ/wiki/
https://buhehe.de/wiki/
があります。
URLから「カテゴリ」という用語が削除されましたが、こちらをご覧ください。https://buhehe.de/wiki/page/2
2番目のカテゴリページは表示されませんが、実際には2番目のページがあります。
問題はどこだ?
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 structure for Categories
https://example.com/category-slug
このため:
WordPress Admin Panel Menu
→Settings
に移動します。.
テキストフィールドに単一のドット(Category base
)を入力します。# URL structure for Posts
https://example.com/category-slug/post-slug
このため:
WordPress Admin Panel Menu
→Settings
に移動します。Custom Structure
を選択し、/%category%/%postname%/
テキストフィールドにCustom Structure
を入力します。いくつかの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にこれらの用語を使用することをお勧めします。
Yoast のようにSEOプラグインを使用することもできます。これには カテゴリの削除 というオプションがあります。
役に立つかもしれないいくつかの関連記事:
これが私の解決策です。
私の場合もこれはページ付けのあるページでも動作します。
試してみて、うまくいくかどうかを教えてください。
// 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;
}