自动提前'#'嵌入子页面永久链接

时间:2014-04-15 21:13:22

标签: php wordpress

问题

我希望http://www.foo.com/fooparent/foochild之类的任何子页面网址自动变为http://www.foo.com/fooparent/#foochild

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

用例

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

2 个答案:

答案 0 :(得分:2)

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

# 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;
}

<强>链接:

答案 1 :(得分:0)

.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的评论,指出粗略的正则表达式替换示例。