删除固定链接中的分层页面

时间:2013-03-21 作者:Steven Smethurst

我在我的网站上有几个页面设置为层次结构。当前站点的页面和URL如下所示。

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/
我想从URL中删除页面层次结构,而只使用页面名称。目前这对于“POSTS”来说不是问题,因为我已经将“Permalink”设置为/%postname%/

Edit: 我想这样做的原因是;我正在将现有网站导入wordpress。现有网站的页面(菜单)具有层次结构,但url结构是扁平的。我不知道这是否对SEO有任何额外的好处,但我想保持URL结构与旧站点相同

3 个回复
SO网友: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 );
我在这里做的是拦截parse_request 如果是pagename请求,而pagename中没有“/”,那么我会检查是否可以找到具有正确名称的帖子。如果我找到一个页面,我会设置查询变量,这允许请求链的其余部分正常进行,因为WordPress认为请求是完整的层次结构请求。

您还需要将筛选器添加到post_type_link 以便正确生成链接(否则它们将继续具有层次结构)。

SO网友:Krzysiek Dróżdż

我不会改变page permalink的行为。更简单/更安全的解决方案是设置平面页面层次结构(如果您真的希望它是平面的)。

如果您想在菜单中拥有层次结构,您仍然可以拥有它-您可以创建自定义菜单并使用wp_nav_menu 作用

SO网友:ptica

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\' );
从wp 4.7开始,您需要解决parse\\u请求:Asuse_verbose_page_rules 已触发,并且get_page_by_path 呼叫检查page 家长及其在url中的状态(!)-可以通过添加evil 空间如中所示https://github.com/weaveworks/wordepress/blob/master/plugin/wordepress/wordepress.php#L91

当然,这是非常脆弱的,应该避免:)

本演示文稿可能包含更好的答案,但我无法理解:https://www.slideshare.net/MikeSchinkel/hardcore-url-routing-2014?next_slideshow=1

结束

相关推荐

Dynamic Menu drops pages?

I\'ve created a Dynamic Menu that highlights the selected page and colors for example the blog page \"red\" while the other links (home, about, contanct) remain white. My question is how can I make the Dynamic Menu work when say the blog goes to