Zum Beispiel habe ich eine Kategorie /wiki/
https://buhehe.de/wiki/
Der Begriff "Kategorie" wurde aus der URL entfernt, siehe jedoch: https://buhehe.de/wiki/page/2
Die zweite Kategorieseite wird nicht angezeigt, es wird jedoch eine zweite Seite angezeigt.
Wo ist das Problem?
Angenommen, Sie haben eine Kategorie mit dem Namen wiki
.
Wenn Sie jetzt eine Kategorie-URL haben wie: https://example.com/wiki
(anstelle von https://example.com/category/wiki
) und eine Seiten- oder Beitrags-URL wie:
https://example.com/a-page
or
https://example.com/category-slug/a-post
WordPress hat wirklich keine Möglichkeit zu wissen, ob https://example.com/wiki/page/2
die zweite Seite einer anderen Seite/eines anderen Posts oder die zweite Seite eines Kategoriearchivs ist (weil wiki
sehr wohl ein Seitenbutzen oder page
ein Postbutzen unter der Kategorie wiki
sein kann).
Dies geschieht speziell, weil WordPress mit /page/2
Teil als eine andere mehrteilige paginierte Seite oder einen anderen Beitrag verwechselt.
Anstatt also die nächsten Seiten Ihres wiki
-Kategoriearchivs zu laden, wird WordPress versuchen, einen paginierten Beitrag mit dem Slug page
zu laden, und Sie erhalten einen 404
-Fehler (Seite nicht gefunden), anstatt die zweite Seite des Kategoriearchivs zu erhalten.
Bevor ich Ihnen die Lösung für dieses Problem gebe, stellen Sie zunächst sicher, dass Sie den richtigen Permalink haben.
Die von Ihnen gewünschte URL-Struktur erfordert einige Arbeit. Befolgen Sie die nachstehenden Anweisungen, um die URL-Struktur zu erhalten, sofern Sie dies noch nicht getan haben:
# URL structure for Categories
https://example.com/category-slug
Dafür:
WordPress Admin Panel Menu
→ Settings
..
) in das Textfeld Category base
ein.# URL structure for Posts
https://example.com/category-slug/post-slug
Dafür:
WordPress Admin Panel Menu
→ Settings
.Custom Structure
und geben Sie /%category%/%postname%/
in das Textfeld Custom Structure
ein.Einige SEO-Plugins haben eine Lösung für dieses Problem. Da dies jedoch ein Kernproblem der URL-Struktur Ihrer Website ist, ist es besser, sich nicht auf SEO-Plugins zu verlassen. Was ist, wenn Sie das SEO-Plugin in Zukunft ändern möchten und das andere Plugin bessere Optionen bietet, aber keine Lösung dafür bereitstellt?
Daher ist es besser, ein einfaches Plugin zu verwenden, das nur dieses eine Problem behebt. Sie können den folgenden CODE verwenden und in Ihrem Plugin-Verzeichnis mit dem Dateinamen category-pagination-fix.php
speichern und dann das Plugin mit dem Namen Category Pagination Fix
im Administrationsbereich der Site aktivieren:
<?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' );
Die obige Lösung funktioniert perfekt mit Paginierung, wenn Sie eine Kategorie-URL haben wie:
https://example.com/category-slug/
und poste URL wie:
https://example.com/category-slug/post-slug
Wenn Sie jedoch eine Unterkategorie-URL wie die folgende haben:
https://example.com/category-slug/sub-category-slug
oder, wenn Sie eine Post-URL haben wie:
https://example.com/post-slug
die obige einfache Lösung funktioniert nicht.
In solchen Fällen können Sie ein Plugin wie Remove Category URL verwenden.
Diese Art von Plugins führen einige grundlegende Änderungen beim Umschreiben von URLs durch. Aus diesem Grund funktioniert das Standardverhalten von WordPress möglicherweise nicht wie erwartet, nachdem Sie eines dieser Plugins verwendet haben. Verwenden Sie also die für Sie am besten geeignete Lösung, aber stellen Sie sicher, dass Sie nicht versuchen, dasselbe in mehreren verschiedenen Plugins zu tun .
Achtung: Verwenden Sie diese Art von kopfloser Archiv-URL (z. B. kein
category
oder ähnlicher Begriff für Kategorieseitenlinks, keintag
oder ähnlicher Begriff für Tag-Seitenlinks usw.) .) erzeugt interne Konflikte mit Seiten- und Post-URLs. Die WordPress-Engine benötigt viele interne Überprüfungen, um festzustellen, welche geladen werden sollen und welche nicht. Dieser Prozess ist ressourcenhungrig. Wenn Ihre Site also Tausende von Seiten, Posts, Kategorien, Tags usw. enthält, ist es besser, diese Begriffe in der URL zu verwenden.
Sie können ein SEO-Plugin wie Yoast verwenden, das die Option Kategorien entfernen aufweist, oder Sie können die Funktion selbst programmieren, die in einigen der folgenden Links erläutert wird.
Einige verwandte Beiträge, die Ihnen helfen könnten:
Wie Kategorie aus WordPress-URL entfernen?
Kategorie & Tag-Basis aus WordPress-URL entfernen - ohne Plugin
Hier ist meine Lösung.
Dies funktioniert in meinem Fall auch auf einer paginierten Seite.
Bitte probieren Sie es aus und lassen Sie es mich wissen, wenn es funktioniert.
// 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;
}