So erhalten Sie Permalinks mit Kategoriebasis, die mit Unterkategorien arbeiten

7

Ich bin auf ein Problem mit einer Site gestoßen, die die Kategoriebasis benötigt, die auch in der benutzerdefinierten Permalink-Struktur enthalten ist. Ich weiß, dass dies ein Problem ist und ich habe viele Beiträge wie diesen gelesen , die mir einen Einblick gaben ...

Ich muss die Permalinks so funktionieren lassen:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Meine Permalink-Einstellungen sind: Benutzerdefinierte Struktur:

/industries/%category%/%postname%/

Kategorie Basis:

industries/.

Das bringt mich dazu zu arbeiten mit:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Es scheint also, dass nur die untergeordneten Kategorien ein Problem darstellen.

http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}

Ich kann die Kategorie-ID durch Abfangen des 404 abrufen, kann jedoch nicht sehen, wie die Kategorieseite mit der richtigen Kategorie-ID geladen wird.

Meine Frage lautet also: Gibt es eine Möglichkeit, die Kategorieseite durch Aufrufen eines internen Befehls zu laden, oder muss ich meine eigene Methode zum Laden der Kategorieseite schreiben? Ich hatte gehofft, dass ich eine WP-Funktion verwenden könnte, da dies ideal wäre. Wenn dies das letztere ist, gibt es etwas Besonderes, das ich beachten muss? Ich weiß, dass ich festlegen muss status_header(200);, wollte aber wissen, ob andere Header oder wichtige Schritte erforderlich sind.

Außerdem funktioniert eine Weiterleitung für meinen Zweck nicht. Ich muss die Kategorieseite mit der neuen ID laden. Wenn es hilft, ist der Haken, den ich in WP verwende, um den 404 zu fangen, folgender:template_redirect

Vielen Dank für alle Informationen, die Sie zu diesem Thema bereitstellen können.

Jeremy
quelle

Antworten:

9

Ich konnte das eigentlich ganz einfach zum Laufen bringen. Ich kann jetzt meine Kategoriebasis in meinen Permalinks haben. Dadurch kann ich jetzt URLs haben wie:

http://www.new1450.dev/industries/ {Main blog post only showing category selection}
http://www.new1450.dev/industries/development/ {a parent category}
http://www.new1450.dev/industries/development/parent-category-i/ {child of parent}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/ {child of child}
http://www.new1450.dev/industries/development/parent-category-i/child-category-i/some-cool-post/ {actual post}

Dies sollte für jede Ebene der Kategorieverschachtelung funktionieren.

Meine Permalink-Einstellungen:

Benutzerdefinierte Struktur: /industries/%category%/%postname%/

Kategoriebasis: industries/.( /.ist erforderlich, da 404s für die Post verhindert werden)

Code:

/**
 * Fix 404 for permalinks using category_base
 */
function permalinkWithCategoryBaseFix() {
    global $wp_query;
    // Only check on 404's
    if ( true === $wp_query->is_404) {
        $currentURI = !empty($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/') : '';
        if ($currentURI) {
            $categoryBaseName = trim(get_option('category_base'), '/.'); // Remove / and . from base
            if ($categoryBaseName) {
                // Perform fixes for category_base matching start of permalink custom structure
                if ( substr($currentURI, 0, strlen($categoryBaseName)) == $categoryBaseName ) {
                    // Find the proper category
                    $childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);
                    // Make sure we have a category
                    if (is_object($childCategoryObject)) {
                        $paged = ($wp_query->query_vars['paged']) ? $wp_query->query_vars['paged']: 1;
                        $wp_query->query(array(
                                              'cat' => $childCategoryObject->term_id,
                                              'paged'=> $paged
                                         )
                        );
                        // Set our accepted header
                        status_header( 200 ); // Prevents 404 status
                    }
                    unset($childCategoryObject);
                }
            }
            unset($categoryBaseName);
        }
        unset($currentURI);
    }
}

add_action('template_redirect', 'permalinkWithCategoryBaseFix');

Ich hatte ursprünglich:

$childCategoryObject = get_category_by_slug( ((!empty($wp_query->query_vars['page']) && $wp_query->query_vars['page'] > 1) ? $wp_query->query_vars['category_name'] : $wp_query->query_vars['name']) );

anstelle von:

$childCategoryObject = get_category_by_slug($wp_query->query_vars['name']);

aber es scheint, dass eine Überprüfung nicht notwendig war. Ich habe diesen Kommentar hinterlassen, falls ich ihn aus einem Grund hatte, an den ich mich nicht erinnern konnte ...

Außerdem hatte ich Probleme mit meiner Standardkategorie-Paginierung ... Eine schnelle Suche gibt viele Personen mit demselben Problem zurück (geht nicht über Seite 2 hinaus), daher habe ich auch dieses Update hinzugefügt. Ich habe diesen Fix in einem WordPress-Plugin gefunden: Category Pagination Fix . Ich habe den Code aktualisiert und das Update ist unten:

/**
 * Fix the problem where next/previous of page number buttons are broken of posts in a category when the custom permalink
 * The problem is that with a url like this:
 * /categoryname/page/2
 * the 'page' looks like a post name, not the keyword "page"
 */
function fixCategoryPagination($queryString) {
    if (isset($queryString['name']) && $queryString['name'] == 'page' && isset($queryString['page'])) {
        unset($queryString['name']);
        // 'page' in the query_string looks like '/2', so i'm exploding it
        list($delim, $page_index) = explode('/', $queryString['page']);
        $queryString['paged'] = $page_index;
    }
    return $queryString;
}

add_filter('request', 'fixCategoryPagination');

Hinweis: Es ist zu beachten, dass die Paginierungskorrektur nur für die übergeordneten Kategorien erforderlich war. Die Kinderkategorien hatten kein Problem mit der Paginierung.

Jeremy
quelle