Übergeordnete Seite (n) aus Permalink entfernen

7

Ähnliche Fragen wurden bereits gestellt, aber keine Antwort passt gut.

Ich habe: site.com/parent-page/child-page und möchte:site.com/child-page

Daher möchte ich ausschließlich Permalinks mit der Tiefe 1 haben, ohne das benutzerdefinierte Menü zu verwenden, aber trotzdem meine Seiten in der Ansicht "Alle Seiten des Administrators" und mit übergeordneten / geordneten Seitenattributen "hierarchisieren".

Die Lösung muss auch automatisch funktionieren, damit Permalinks nicht auf jeder Seite mit dem Plugin "Benutzerdefinierte Permalinks" geändert werden.

Dies ist, was ich brauche, und ich bin sicher, dass es mit ein paar Codezeilen in der möglich ist functions.php, die ich an anderer Stelle gefunden habe, aber nur für Beiträge, um die Kategorie zu entfernen, aber nicht für Seiten, um die übergeordneten zu entfernen.

Dies ist ein solcher Code, der möglicherweise geändert werden kann, um für Seiten zu funktionieren ?

add_filter( 'post_link', 'remove_parent_cats_from_link', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename ) {
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Make sure we use the same start cat as the permalink generator
        usort( $cats, '_usort_terms_by_ID' ); // order by ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // If there are parent categories, collect them and replace them in the link
            $parentcats = get_category_parents( $parent, false, '/', true );
            // str_replace() is not the best solution if you can have duplicates:
            // example.com/luxemburg/luxemburg/ will be stripped down to example.com/
            // But if you don't expect that, it should work
            $permalink = str_replace( $parentcats, '', $permalink );
        }
    }
    return $permalink;
}
Sofian
quelle

Antworten:

1

Eine schnelle Suche zeigt ein anderes Thema zum Austausch von Stapeln an und verwendet diesen Code, um den Permalink von Eltern / Vorfahren zu bereinigen:

function wpse_101072_flatten_hierarchies( $post_link, $post ) {
    if ( 'page' != $post->post_type )
        return $post_link;

    $uri = '';
    foreach ( $post->ancestors as $parent ) {
        $uri = get_post( $parent )->post_name . "/" . $uri;
    }

    return str_replace( $uri, '', $post_link );
}
add_filter( 'post_type_link', 'wpse_101072_flatten_hierarchies', 10, 2 );

Diese Diskussion finden Sie hier: Entfernen des übergeordneten Slugs aus der URL für einen benutzerdefinierten Beitragstyp

Nicü
quelle
Das macht lustige Dinge :) Diejenigen, die einen Elternteil haben, zeigen immer noch mit den Eltern, aber diejenigen ohne Elternteil führen zu 404: D Und es wird auch über benutzerdefinierte Beitragstypen gesprochen, und Sebastian stellt am Ende die gleiche Frage wie ich, wie damit es für Seiten funktioniert, die unbeantwortet blieben. Ich hoffe also immer noch, dass es eine Antwort findet.
Sofian
1

tl; dr = Installiere das kostenlose Plugin " Permalinks Customizer ". Setzen Sie "PostTypes-Einstellungen" für Seiten auf " % postname% " und bearbeiten Sie die Seiten, um die entsprechenden Permalinks entsprechend zu ändern. Ich habe dies mit einem Szenario von hierarchischen und nicht hierarchischen Seiten getestet, und ivt funktioniert ohne Schwierigkeiten.


Die längere Antwort
Das Szenario des OP basiert auf einer generischen Seite und stellt meiner Ansicht nach eine erhebliche, möglicherweise unmögliche Herausforderung dar, da die Lösung anonym angewendet werden muss. Das heißt, es gibt keinen vorhersehbaren "Trigger" oder "Handle", mit dem ein Umschreiben erstellt werden kann, mit dem eine gültige Anforderung erstellt wird. Ein benutzerdefinierter Beitragstyp funktioniert möglicherweise (oder nicht), aber das OP hat dies als diese Option ausgeschlossen. Der vom OP vorgeschlagene Ansatz birgt auch das Risiko doppelter Seiten. In Anbetracht all dessen könnte man vorschlagen, dass der vom OP vorgeschlagene Ansatz weder lohnenswert noch klug ist - aber ich überlasse es dem OP, sich selbst zu beurteilen.

Das OP ist ganz richtig; Die von Nicu vorgeschlagene Antwort funktioniert nicht, da diese Linie den Uri aus der ursprünglichen Abstammung aufbaut.

$uri = get_post( $parent )->post_name . "/" . $uri;

Ich habe ( erfolglos ) an einem Filter gearbeitet, der die Anforderungen des OP erfüllt. Ich biete es hier nur für den Fall an, dass es für jemand anderen nützlich sein könnte. Zu Referenzzwecken wurden alle meine Tests mit Permalinks durchgeführt, die auf "Post Name" eingestellt waren, und jedes Mal, wenn ich einen Filter anpasste, habe ich die Permalinks-Seite aktualisiert. Ich habe vier Seiten erstellt. Vorfahren, Eltern (Eltern = 'Vorfahren'), Kinder (Eltern = 'Eltern') und Transport (keine Eltern).

Ich fand, dass das Erstellen des Uri der einfache Teil ist oder zumindest einfach zu sein scheint. Diese Alternative (in functions.php) funktioniert:

function wpse_182006_pages_permalink( $link, $post_id) {

    // get the post_type and evaluate
    $posttype = get_post_field( 'post_type', $post_id, 'display' );
    if ($posttype !== 'page'){
        return link;
    }

    // build the uri from the slug
    $slugname = get_post_field( 'post_name', $post_id, 'display' );
    $slugname = $slugname."/";
    $link = home_url($slugname);
    return $link;

}

add_filter( 'page_link', 'wpse_182006_pages_permalink', 10, 3 );

Sowohl die Seiten "Vorfahren" als auch "Transport" werden normal geöffnet.
Auf den Seiten "Eltern" und "Kinder" (jeweils mit einer "Eltern" -Seite) werden 404 Fehler angezeigt.
Wenn Sie sich die Anforderungsabfrage ansehen (siehe unten), ist es offensichtlich, dass der 404 generiert wird, weil WordPress die "Seite" als "Beitrag" interpretiert und kein solcher Beitrag existiert. Beachten Sie, dass die Post-ID in den fehlgeschlagenen Abfragen nicht verwendet wird. Vielleicht ist dies der Schlüssel zu einem erfolgreichen Umschreiben, aber es war jenseits meiner Möglichkeiten.

Als Referenz sind dies "Anforderungs" -Details für "Abstammung":
Übereinstimmende Abfrage = 'Seitenname = Vorfahr & Seite ='
Übereinstimmende Regel = '(.?. +?) (?: / ([0-9] +))? /? $‘
Haupt Abfrage = SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 und (wp_posts.ID = '46') und wp_posts.post_type = 'Seite' ORDER BY wp_posts.post_date DESC

Im Vergleich dazu sind dies "Anforderungs" -Details für "Kinder":
Übereinstimmende Abfrage = 'Name = Kinder & Seite ='
Übereinstimmende Regel = '([^ /] +) (?: / ([0-9] +))? /? $‘
Haupt Abfrage = SELECT wp_posts. * FROM wp_posts WHERE 1 = 1 und wp_posts.post_name = 'Eltern' AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC


FWIW: Wenn Sie den Permalink auf diese Weise einstellen, kann der Permalink nicht bearbeitet werden. Vor:
Geben Sie hier die Bildbeschreibung ein

Nach:
Geben Sie hier die Bildbeschreibung ein

Tedinoz
quelle