【问题标题】:Automatically prepending '#' to slug in child page permalinks自动在子页面永久链接前添加“#”
【发布时间】:2014-05-30 10:52:08
【问题描述】:

问题

我想让任何像http://www.foo.com/fooparent/foochild 这样的子页面网址自动变成http://www.foo.com/fooparent/#foochild

这可以通过 htaccess 重写规则或任何类型的 Wordpress 钩子来完成吗?

用例

我让父页面加载模板中的所有子页面内容。它使用单页布局,锚链接在您导航时向下滚动页面到每个部分。在某些情况下,子页面的永久链接会暴露出来,这会破坏单页功能。子永久链接应该只加载它的父页面并使用它的 slug 作为 URL 中的 #anchor。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    我正在遍历所有类别,获取链接,如果它是子类别,我使用正则表达式将最后一个 / 替换为 #

    # Code to display category links
    foreach(wp_list_categories() as $category) {
        $name = $category->name;
        $link = get_category_link($category->term_id);
    
        if($category->parent) {
            // Parent isn't 0, lets change this link to have an anchor
            $link = preg_replace('~/([^/]+)/?$~', '#$1', $link);
        }
    
        // Output $name/$link
    }
    

    regex /([^/]+)/?$ 匹配 /,后跟捕获组中的任何非 / 字符(锚点),后跟可选的尾随斜杠和字符串结尾 ($) .我们可以将此匹配项替换为英镑,并保存在我们的第一个捕获组 (#$1) 中。


    更新:

    作为前缀,我无法从文档中判断 get_the_category() 是否获取类别模板的当前类别..但让我们假设它确实如此。然后你可以这样做:

    # Code to redirect away from subcategory pages
    $category = get_the_category(); // not sure if this works
    
    // We are directly accessing a child category, redirect
    if($category->parent) {
        $link = get_category_link($category->term_id);
        $link = preg_replace('~/([^/]+)/?$~', '#$1', $link);
    
        header("HTTP/1.1 301 Moved Permanently"); 
        header("Location: $link");
        exit;
    }
    

    链接:

    【讨论】:

    • 我已经提醒菜单添加 /# 部分很好,但是在某些用例中,原始永久链接会暴露出来,如果有人被引导到那里,单页布局就会中断。我正在尝试强制子页面的原始永久链接添加“#”
    • @Tom 您不能将 Wordpress 需要知道的任何信息放在哈希之后。 PHP 请求不会让它能够查找孩子。哈希值不会发送到服务器。
    • @ray 也许我应该检测到您使用 javascript 登陆子页面并重定向到添加锚点的父 URL。这实际上只是一种预防措施,如果有人写 www.foo.com/parentfoo/childfoo 它将重定向到 parentfoo/ 但将 #childfoo 添加为锚。
    • @Tom 所以孩子 foo 是 parentfoo 页面上的内容?你永远不会直接请求 childfoo 吗?这意味着这两个网址应该解析为相同的www.foo.com/parentfoo == www.foo.com/parentfoo#childfoo
    • @ray 对。所有子页面内容都被 ajax 加载到父页面中。我只是为管理结构这样做。我知道这很令人困惑,但对于添加页面内容的用户/客户来说,这是有道理的。您基本上是在欺骗 wordpress 将部分添加到主要类别中作为一页。我正在使用锚链接来上下滚动页面。我只是想要预防措施,如果有人遗漏了#anchor,他们不会把整个事情搞砸。
    【解决方案2】:

    .htaccess 不会看到或处理哈希,它们是在客户端解析的——您无权在服务器上的请求中访问它们。因此,您将无法在 wordpress 中检测到它。参考这个更一般的问题:Can I read the hash portion of the URL on my server-side application (PHP, Ruby, Python, etc.)?

    即使您在服务器端建立新链接,当有人点击该链接时,wordpress 也不会在哈希后得到任何用于查找内容的内容。所以它无法查找子页面。

    但是,如果您不尝试重写传入请求,而是修改正在显示的链接,则可以在生成链接但在显示链接之前在 PHP (wordpress) 中手动执行此操作。有关粗略的正则表达式替换示例,请参阅对您的 OP Sam 的评论。

    【讨论】:

    • 我认为他想在将链接发送到客户端之前更改服务器端的链接。我相信类别页面已经设置为具有锚的所有子类别。 (我的解释)
    • @Sam 是的,我不确定他关心的是哪一方,因为他提到了 htaccess 文件。
    • 在 Wordpress 中,我认为您可以编辑 wordpress 如何处理其自己的永久链接/重写结构。虽然不直接编辑实际的 htaccess 文件。
    • @Tom 是的,在 WP 管理面板中有一个修改永久链接格式的页面。
    • @Tom 设置在 Settings->permalinks
    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多