web-dev-qa-db-de.com

Hierarchische Seiten im Permalink entfernen

Ich habe mehrere Seiten in einer Hierarchie auf meiner Site eingerichtet. Derzeit sehen die Seiten und URLs der Site so aus.

Page name        | Current URL           | Preferred URL 
-----------------|----------------------------------------
Page AAA         | /pageAAA/             | /pageAAA/
|-- Page BBB     | /pageAAA/pageBBB/     | /pageBBB/
Page CCC         | /pageCCC/             | /pageCCC/
Page DDD         | /pageDDD/             | /pageDDD/
|-- Page EEE     | /pageDDD/pageEEE/     | /pageEEE/

Ich möchte die Seitenhierarchie von der URL entfernen und stattdessen nur den Seitennamen verwenden. Derzeit ist dies kein Problem für die "POSTS", da ich den "Permalink" auf /%postname%/ gesetzt habe

Bearbeiten: Der Grund, warum ich das tun möchte, ist; Ich importiere eine vorhandene Site in WordPress. Die vorhandene Site hat eine Hierarchie für die Seiten (Menü), aber eine flache URL-Struktur. Ich weiß nicht, ob dies einen zusätzlichen Nutzen für SEO hat, aber ich möchte, dass die URL-Struktur der alten Website entspricht

5

Ich wäre gespannt, ob jemand eine bessere Lösung dafür finden kann. Folgendes habe ich mir ausgedacht:

function wpse_91821_flatten_page_paths( $wp ) {
    if ( false !== strpos( $wp->matched_query, 'pagename=' ) && isset( $wp->query_vars['pagename'] ) && $wp->query_vars['pagename'] && false === strpos( $wp->query_vars['pagename'], '/' ) ) {
        if ( !get_page_by_path( $wp->query_vars['pagename'] ) ) {
            $page = get_posts( array(
                'name'        => $wp->query_vars['pagename'],
                'post_type'   => 'page',
                'post_status' => 'publish',
                'numberposts' => 1
            ) );
            if ( $page && isset( $page[0] ) ) {
                $wp->query_vars['pagename'] = get_page_uri( $page[0]->ID );
                $wp->request = $wp->query_vars['pagename'];
            }
        }
    }
}
add_action( 'parse_request', 'wpse_91821_flatten_page_paths', 5 );

Was ich hier mache, ist das Abfangen von parse_request und wenn es sich um eine Seitennamenanfrage handelt und der Seitenname kein "/" enthält, überprüfe ich, ob ich einen Beitrag mit dem richtigen Namen finden kann. Wenn ich eine Seite finde, setze ich die Abfragevariable, die es dem Rest der Anforderungskette ermöglicht, wie gewohnt fortzufahren, da WordPress denkt die Anforderung die vollständige Hierarchie ist.

Sie möchten auch einen Filter zu post_type_link hinzufügen, damit Ihre Links korrekt generiert werden (andernfalls bleiben sie weiterhin hierarchisch).

1
Matthew Boynes
function wpse_91821_flatten_page_paths( $wp ) {
    if ( false !== strpos( $wp->matched_query, 'pagename=' ) && isset( $wp->query_vars['pagename'] ) && $wp->query_vars['pagename'] && false === strpos( $wp->query_vars['pagename'], '/' ) ) {
        if ( !get_page_by_path( $wp->query_vars['pagename'] ) ) {
            $page = get_posts( array(
                'name'        => $wp->query_vars['pagename'],
                'post_type'   => 'page',
                'post_status' => 'publish',
                'numberposts' => 1
            ) );
            if ( $page && isset( $page[0] ) ) {
                $wp->query_vars['pagename'] = get_page_uri( $page[0]->ID );
                $wp->request = $wp->query_vars['pagename'];
            }
        }
    }
}
add_action( 'parse_request', 'wpse_91821_flatten_page_paths', 5 );

function custom_permalinks_page_link( $permalink, $post_id ) {
    if ( empty( $post_id ) ) return $permalink;
    $post = get_post( $post_id );
    return home_url( $post->post_name . "/");
}
add_filter( 'page_link', 'custom_permalinks_page_link', 10, 2 );

function custom_rewrite() {
    add_rewrite_rule('^([^/]+)?', 'index.php?pagename= $matches[1]', 'top');
}
add_action( 'init', 'custom_rewrite' );

Ab wp 4.7 müssten Sie die parse_request umgehen: Da use_verbose_page_rules ausgelöst wird und get_page_by_path die Eltern von page und deren Vorhandensein in der URL (!) Überprüft, könnte diese unerwartete Kernprüfung durch Hinzufügen eines evil vermieden werden. Speicherplatz wie in https://github.com/weaveworks/wordepress/blob/master/plugin/wordepress/wordepress.php#L91

Das ist natürlich sehr fragil und sollte wohl vermieden werden :)

Diese Präsentation könnte eine bessere Antwort enthalten, aber ich konnte sie nicht nachvollziehen: https://www.slideshare.net/MikeSchinkel/hardcore-url-routing-2014?next_slideshow=1

0
ptica

Ich würde das Verhalten von Seiten-Permalinks nicht ändern. Eine viel einfachere/sicherere Lösung besteht darin, eine flache Seitenhierarchie festzulegen (wenn Sie wirklich möchten, dass die Seite flach ist).

Wenn Sie eine Hierarchie im Menü haben möchten, können Sie sie trotzdem haben - Sie können ein benutzerdefiniertes Menü erstellen und es mit der Funktion wp_nav_menu anzeigen.

0