it-swarm.com.de

Wenn eine Seite nicht vorhanden ist, schließen Sie eine andere Seite ein?

Ich richte eine Website für einen Kunden ein, auf der er verschiedene Bereiche haben möchte:

Regular Site (/)
  - Section 1 (/section_1/)
  - Section 2 (/section_2/)
     ... 
  - Section X

Die reguläre Site enthält den gesamten Hauptinhalt, aber ich möchte bestimmte Seiten überschreiben können, wenn sie im angegebenen Abschnitt vorhanden sind.

Angenommen, der Benutzer besucht domain.com/section_1/features. Wenn eine /section_1/features Seite existiert, möchte ich das anzeigen; Wenn die Seite jedoch nicht vorhanden ist, möchte ich, dass /features angezeigt wird, ohne die URL in der Adressleiste umzuleiten oder zu ändern. Es sollte völlig nahtlos und hinter den Kulissen sein.

Ich denke , ich muss dem Hook parse_request eine Funktion hinzufügen, so etwas wie:

function check_section_page( &$wp ) {
    $requested_path = $wp->request;

    if ( ! get_page_by_path($requested_path) ) {
        $new_requested_path = preg_replace("/^(.*?)\//", "", $requested_path);
        // do something here to make it read $new_requested_path
    }
}

add_filter("parse_request", "check_section_page");

Die Funktion wird ordnungsgemäß ausgeführt, und wenn $ new_requested_path als Echo ausgegeben wird, wird angezeigt, dass die neue erforderliche Seite vorhanden ist. Ich habe ungefähr 2 Stunden damit gekämpft und mein Kopf ist fertig. Hilfe?

1
Rob Williams

Ich habe es geschafft, das Problem zu lösen. Gehen Sie wie folgt vor, falls jemand diese Lösung benötigt.

** Aktualisiert am 10. März 3:30 EST **

Die vorherige Funktion, die ich hier hatte, zeigte die Seite richtig an, gab aber einen 404-Fehlercode zurück. Ich habe das fehlerhafte Codebeispiel durch ein funktionierendes ersetzt, bei dem kein 404 zurückgegeben wird.

function check_section_page( $posts ) {

    if (is_admin()) { return $posts; }

    global $wp, $wp_query;

    $requested_path = $wp->request;

    if ( $requested_path == "" ) { return $posts; }

    preg_match("/^([a-z\-]+)\//", $requested_path, $matches);

    if ( count($matches) > 1 ) {
        if ( get_page_by_path( $matches[1] ) ) { $section = $matches[1]; }
    }

    $wp_query->set("saleslink_section", $section);

    $this_page = get_page_by_path( $requested_path );
    $new_requested_path = preg_replace("/^(.*?)\//", "", $requested_path);
    $requested_page = get_page_by_path($new_requested_path);

    if ( $requested_page->ID and ! $this_page->ID ) {

        $posts = NULL;

        $posts[] = $requested_page;
        $wp_query->is_page = true;
        $wp_query->is_singular = true;
        $wp_query->is_home = false;
        $wp_query->is_archive = false;
        $wp_query->is_category = false;
        unset($wp_query->query["error"]);
        $wp_query->query_vars["error"]="";
        $wp_query->is_404=false;

    }

    return $posts;

}

remove_filter('template_redirect','redirect_canonical');
add_filter("the_posts", "check_section_page");

Die Zeile remove_filter deaktiviert das automatische Umleitungsverhalten von Wordpress, wenn eine angeforderte URL nicht vorhanden ist und eine ähnliche URL vorhanden ist und zur ähnlichen URL umgeleitet wird.

1
Rob Williams