我很好奇是否有人能找到更好的解决办法。以下是我的想法:
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
以便正确生成链接(否则它们将继续具有层次结构)。