it-swarm.dev

ページが存在しない場合は、別のページを含めますか?

私は彼らがいくつかの異なるセクションが欲しいクライアントのためにウェブサイトをセットアップしています。

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

通常のサイトにはすべてのメインコンテンツが含まれますが、特定のページが特定のセクションに存在する場合はそれらを上書きできるようにしたいと思います。

ユーザーがdomain.com/section_1/featuresにアクセスしたとしましょう。 /section_1/featuresページが存在する場合は、それを表示します。ただし、ページが存在しない場合は、アドレスバーのURLをリダイレクトまたは変更している/featureswithoutを表示します。それは完全にシームレスで舞台裏にあるべきです。

I think私はparse_requestフックに関数を追加する必要があります。

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");

これは関数を正しく実行し、$ new_requested_pa​​thをエコーアウトすると、新しい必要なページがあることがわかります。私は約2時間これと戦ってきました、そして私の頭は中でやりました。助けて?

1
Rob Williams

私は問題を解決することができた。他の誰かがこのソリューションを必要とする場合に備えて、これを行う方法は次のとおりです。

** 3月10日午前3時30分東部標準時間**に更新

私がここで持っていた前の関数はページを正しく表示していました、しかし404エラーコードを返していました。悪いコードの例を404を返さない実用的なものに置き換えました。

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");

remove_filter行は、要求されたURLが存在せず、類似したURLが存在し、類似したURLにリダイレクトするときに、Wordpressの自動URL推測リダイレクト動作をオフにします。

1
Rob Williams