如何在没有插件的情况下在link-template.php中自定义我的WordPress快捷链接结构?

时间:2011-08-25 作者:Matt

目前,我的短链接结构如下所示:

实例com/?p=451

我希望它看起来更像这样:

实例通信/abc123

你知道我如何修改代码来做到这一点吗?

3 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

好的,正如我在给你们的评论中提到的:修改核心文件不是一个好主意。但这里有一个插件解决方案。

首先,我们要创建自己的重写规则s/123 (用post ID替换123)到index.php?short=123. 我们还必须过滤WordPress查询变量,以便以后使用它们。

<?php
add_action( \'init\', \'wpse26869_add_rewrites\' );
function wpse26869_add_rewrites()
{
    add_rewrite_rule( \'^s/(\\d+)$\', \'index.php?short=$matches[1]\', \'top\' );
}

add_filter( \'query_vars\', \'wpse26869_query_vars\', 10, 1 );
function wpse26869_query_vars( $vars )
{
    $vars[] = \'short\';
    return $vars;
}
Theadd_rewrite_rule 通话内容为“重新连接s,后跟斜杠和一个或多个数字串,以index.php?short=the_string_of_digits.

然后,我们可以挂接到模板重定向中,看看我们的查询变量是否存在。如果是,我们将尝试从中获取永久链接。如果失败,我们将抛出404错误。否则,我们将使用“wp\\u redirect”将人员发送到实际的帖子。

<?php
add_action( \'template_redirect\', \'wpse26869_shortlink_redirect\' );
function wpse26869_shortlink_redirect()
{
    // bail if this isn\'t a short link
    if( ! get_query_var( \'short\' ) ) return;
    global $wp_query;

    $id = absint( get_query_var( \'short\' ) );
    if( ! $id )
    {
        $wp_query->is_404 = true;
        return;
    }

    $link = get_permalink( $id );
    if( ! $link )
    {
        $wp_query->is_404 = true;
        return;
    }

    wp_redirect( esc_url( $link ), 301 );
    exit();
}
最后,我们加入get_shortlink 要更改我们的rel=“shortlink”在<head> 现场部分和其他地方。这个新的短链接结构将反映我们上面写的重写规则。

<?php
add_filter( \'get_shortlink\', \'wpse26869_get_shortlink\', 10, 3 );
function wpse26869_get_shortlink( $link, $id, $context )
{
    if( \'query\' == $context && is_single() )
    {
        $id = get_queried_object_id();
    }
    return home_url( \'s/\' . $id );
}
作为插件:https://gist.github.com/1179555

SO网友:its_me

除了@ChristopherDavis的答案之外,您还可以使用独立于PHP的方式来完成它。htaccess。只需添加此规则:

RewriteEngine On
RewriteRule ^s/(\\d+)$ index.php?p=$1 [L]
替代品,无mod_rewrite, 使用mod_alias:

RedirectMatch Permanent ^/s/(\\d+)$ /?p=$1
唯一的问题是,这里会发生两个重定向(而不是1个)-(例如)如果用户访问http://example.com/s/121/ 他被web服务器重定向到http://example.com/index.php?p=121/ 然后通过WordPress访问帖子的实际永久链接。

优点是,这永远不会中断!插件可能会损坏,但这不会。

PS: I use this (短链接结构为http://example.com/-121 其中121为岗位ID):

RewriteEngine On
RewriteRule ^-(\\d+)$ index.php?p=$1 [L]

SO网友:James Revillini

使用Redirection 插件,您可以添加一个重定向来实现这一点,而无需接触PHP或。htaccess。

prerequisites

<安装并设置重定向插件

add redirect

<转到工具>重定向单击add new 按钮

redirect parameters

<源url:^/s/(\\d+)$url选项(位于最右侧):choose regex /index.php?p=$1

this method has the following advantages

<没有PHP编码,没有。htaccess编辑访问跟踪-您可以从仪表板上看到有多少人正在点击短链接重定向-404日志记录-有助于在您弄乱正则表达式灵活性的情况下进行故障排除-如果您愿意,您可以基于帖子类型或来源(例如电子邮件、打印、媒体和youtube)创建多个短链接重定向,以进行跟踪。您可以选择不区分大小写的规则,如果您希望人们手动输入此URL,这将特别有用

notes

感谢@its\\u我的帮助。htaccess方法,因为它为我提供了所需的确切正则表达式

结束

相关推荐

带有Pages_Links的定制POST类型档案404

im使用paginate_links function 要在我的自定义post类型归档文件上创建分页,无论我做什么,在查看第2页时,我都会遇到404个错误(即单击分页跟踪中的一页)。我已经检查和研究过了,似乎没有取得任何进展。这是archive-my\\u CUSTOM\\u POST\\u类型中循环前的my查询。php:<?php global $wp_query; $args = array_merge( $wp_query->query, array(