wake-up-neo.net

So erhalten Sie Permalinks mit Kategoriebasis, die mit Unterkategorien arbeiten

Ich bin auf ein Problem mit einer Website gestoßen, für die die Kategoriebasis auch in der benutzerdefinierten Permalink-Struktur enthalten sein muss. Ich weiß, dass dies ein Problem ist und ich habe viele Posts wie this 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%/

Kategoriebasis:

industries/.

Das bringt mich zum 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 erhalten, indem ich die 404 abfange, aber ich kann 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 Folgendes festlegen muss: status_header(200);, wollte aber wissen, ob andere Überschriften 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: template_redirect

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

7
Jeremy

Ich konnte das ziemlich einfach zum Laufen bringen. Ich kann jetzt meine Kategoriebasis in meinen Permalinks haben. Dies ermöglicht mir jetzt URLs 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 Kategorieschachtelung funktionieren.

Meine Permalink-Einstellungen:

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

Kategoriebasis: industries/. (/. ist erforderlich, da 404s für die Veröffentlichung 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 für den Fall hinterlassen, dass ich ihn aus einem Grund hatte, an den ich mich nicht erinnern konnte ...

Außerdem hatte ich Probleme mit meiner Standardkategorie-Paginierung ... Eine Schnellsuche gibt viele Personen mit demselben Problem zurück (nicht weiter als Seite 2), daher habe ich auch diesen Fix hinzugefügt. Ich habe dieses Update in einem WordPress-Plugin gefunden: Kategorie-Paginierungs-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 sollte beachtet werden, dass der Paginierungsfix nur für die übergeordneten Kategorien erforderlich war. Die Kinderkategorien hatten kein Problem mit der Paginierung.

9
Jeremy