正在从固定链接中删除父页面

时间:2015-03-23 作者:Sofian

以前也有人问过类似的问题,但没有一个答案很合适。

我有:site.com/parent-page/child-page并希望:site.com/child-page

因此,我希望只使用深度为1的永久链接,而不使用自定义菜单,但仍在“管理所有页面”视图中“分层”我的页面,并在页面属性中使用父/顺序。

该解决方案还需要自动工作,因此不需要使用插件“自定义永久链接”更改每个页面上的永久链接。

这就是我所需要的,我相信在functions.php, 我在其他地方找到了它,但只用于删除类别的帖子,而不用于删除父级的页面。

这就是这样的代码,可能可以更改为适用于页面?

add_filter( \'post_link\', \'remove_parent_cats_from_link\', 10, 3 );
function remove_parent_cats_from_link( $permalink, $post, $leavename ) {
    $cats = get_the_category( $post->ID );
    if ( $cats ) {
        // Make sure we use the same start cat as the permalink generator
        usort( $cats, \'_usort_terms_by_ID\' ); // order by ID
        $category = $cats[0]->slug;
        if ( $parent = $cats[0]->parent ) {
            // If there are parent categories, collect them and replace them in the link
            $parentcats = get_category_parents( $parent, false, \'/\', true );
            // str_replace() is not the best solution if you can have duplicates:
            // example.com/luxemburg/luxemburg/ will be stripped down to example.com/
            // But if you don\'t expect that, it should work
            $permalink = str_replace( $parentcats, \'\', $permalink );
        }
    }
    return $permalink;
}

2 个回复
SO网友:Nicü

快速搜索会显示有关此的另一个stackexchange主题,它使用以下代码清理父/祖先的永久链接:

function wpse_101072_flatten_hierarchies( $post_link, $post ) {
    if ( \'page\' != $post->post_type )
        return $post_link;

    $uri = \'\';
    foreach ( $post->ancestors as $parent ) {
        $uri = get_post( $parent )->post_name . "/" . $uri;
    }

    return str_replace( $uri, \'\', $post_link );
}
add_filter( \'post_type_link\', \'wpse_101072_flatten_hierarchies\', 10, 2 );
您可以在此处找到讨论:Removing parent slug from URL on custom post type

SO网友:Tedinoz

tl;dr = 安装免费插件“Permalinks Customizer“。将页面的“PostTypes Settings”设置为“%postname%”,然后编辑页面以相应地修改相应的永久链接。我已经用分层和非分层页面的场景对此进行了测试,ivt工作起来没有任何困难。

<小时>The longer answer
OP的场景基于一个通用页面,在我看来,这是一个重大的、可能是不可能的挑战,因为解决方案必须匿名应用。也就是说,没有可预测的“触发器”或“句柄”可用于创建将创建有效请求的重写。自定义post类型可能会起作用(或不起作用),但OP已将其排除在this选项之外。OP提出的方法也存在重复页面的风险。考虑到所有这些,有人可能会认为OP提出的方法既不值得,也不明智,但我会让OP自己来判断。

OP非常正确;Nicu提出的答案不起作用,因为这一行具有从原始父代构建uri的效果。

$uri = get_post( $parent )->post_name . "/" . $uri;
我有(unsuccessfully) 致力于满足OP要求的过滤器。我在这里提供它,以防它可能对其他人有用。出于参考目的,我的所有测试都是在将Permalinks设置为“Post Name”的情况下完成的,每次我调整过滤器时,都会刷新Permalinks页面。我创建了四页。祖先、父母(父母=\'祖先\')、子女(父母=\'父母\')和交通(无父母)。

我发现创建uri很容易,至少看起来很容易。这个替代方案(在functions.php中)可以工作:

function wpse_182006_pages_permalink( $link, $post_id) {

    // get the post_type and evaluate
    $posttype = get_post_field( \'post_type\', $post_id, \'display\' );
    if ($posttype !== \'page\'){
        return link;
    }

    // build the uri from the slug
    $slugname = get_post_field( \'post_name\', $post_id, \'display\' );
    $slugname = $slugname."/";
    $link = home_url($slugname);
    return $link;

}

add_filter( \'page_link\', \'wpse_182006_pages_permalink\', 10, 3 );
“祖先”和“运输”页面均正常打开
打开“父”和“子”页面(每个页面都有一个“父”页面)会出现404个错误
如果您查看请求查询(请参阅下文),很明显生成404是因为WordPress将“页面”解释为“帖子”,而不存在此类帖子。请注意,在失败的查询中不使用post ID。也许这是成功重写的关键,但这超出了我的能力。

以下是“祖先”的“请求”详细信息以供参考:匹配查询;页码=\'匹配规则(.?.+?)(?:/([0-9]+)?/?$\'
主查询=选择wp\\U帖子。*来自wp\\u posts,其中1=1和(wp\\u posts.ID=\'46\')以及wp\\u posts。post\\u type=“page”按wp\\u posts排序。post\\u日期描述

相比之下,这些是“Children”的“request”详细信息:匹配查询;页面=\'匹配规则([^/]+)(?:/([0-9]+))?/?$\'
主查询=选择wp\\U帖子。*来自wp\\U POST,其中1=1和wp\\U POST。post\\u名称=\'父项\'和wp\\u post。post\\U类型=“post”按wp\\U posts排序。post\\u日期描述

FWIW,通过这样设置永久链接,永久链接是不可编辑的。之前:
enter image description here

之后:
enter image description here

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-