将URL代码段更新为规范的固定链接URL

时间:2014-01-08 作者:Debajyoti Das

我的永久链接的格式为domain.com/post-id/post-slug

我注意到这是permalinks的一个很好的选择,因为我可以使用短URL共享文章,如domain.com/123

但是当我转到这个简短的url时,它是否应该重定向以显示完整的url,因为在地址栏中它只显示domain.com/123

将URL更新为实际URL所需的任何设置,而不增加任何负载或服务器。

UPDATE: 我的要求是不要获得短链接。而是将URL片段转换为完整URL。

例如:如果我键入domain.com/123/wrong-slug 它被更正为domain.com/123/correct-slug 但如果我打字domain.com/123 它不会被更正为domain.com/123/post-slug

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

为什么

我认为

a) domain.com/123
未重定向回

b) domain.com/123/post-slug
使用/%post_id%/%postname%/ permalinks设置,匹配的规则是:

[matched_rule] => ([0-9]+)(/[0-9]+)?/?$
你可以从全球$wp 对象

中还有其他有用的信息$wpwp 措施:

示例(post):domain.com/123/post-slug/

[query_vars] => Array
    (
        [p] => 123
        [page] => 
        [name] => post-slug
    )

[query_string] => p=123&name=post-slug
[request] => 123/post-slug
[matched_rule] => ([0-9]+)/([^/]+)(/[0-9]+)?/?$
[matched_query] => p=123&name=post-slug&page=
[did_permalink] => 1
示例(post):domain.com/123/:
[query_vars] => Array
    (
        [p] => 123
        [page] => 
    )
[query_string] => p=123
[request] => 123
[matched_rule] => ([0-9]+)(/[0-9]+)?/?$
[matched_query] => p=123&page=
[did_permalink] => 1
示例(第页):domain.com/hello-world/:
[query_vars] => Array
    (
        [page] => 
        [pagename] => hello-world
    )

[query_string] => pagename=hello-world
[request] => hello-world
[matched_rule] => (.?.+?)(/[0-9]+)?/?$
[matched_query] => pagename=hello-world&page=
[did_permalink] => 1
重定向示例:下面是一个如何从a)b) 使用来自全球的信息$wp 对象:

add_action( \'wp\', function(){
    global $wp;
    if( is_numeric( $wp->request ) && empty( $wp->query_vars[\'page\'] ) )
    {
        wp_redirect( get_permalink( absint( $wp->request ) ), 301 );
        exit();
    }
});
即,当未设置页面查询变量且请求为数字时,我们重定向。

ps:我只想提一下,这是使用wp 行动,这是发射相当晚,但之前template_redirect 操作,允许重定向。

我还试图想出一个不使用$_SERVER 变量;-)

希望这有帮助。

SO网友:bueltge

默认情况下,WordPress帖子的短链接domain.com/?p=30, 不是域后的Id。如果您喜欢将ID的永久链接作为每个帖子的短链接,那么可以通过插件实现这一点。

下面的源代码就是一个示例。

add_filter(\'get_shortlink\', \'fb_custom_shortlink_filter\');
function fb_custom_shortlink_filter() {
    global $post;

    return get_site_url() . \'/fb/\' . $post->ID;
}
enter image description here

但是,如果您将前端页面与这个新的短url一起使用,则重写很重要。下面是php的解决方案和htaccess中的增强。

在插件中添加源代码,并将其添加到前端或添加到主题文件中index.php. 源检查值token 从url。只有通过中的mor\\u rewrite module增强url,这才可能实现。htaccess,见下文。

if ( ! empty( $_GET[\'token\'] ) ) {
  $id = strip_tags( $_GET[\'token\'] );
  if ( is_numeric( $id ) ) {
    header( $_SERVER[\'SERVER_PROTOCOL\'].\' 301 Moved Permanently\' );
    header( \'Location: \' . get_site_url() . \'?p=\' . $id );
    exit();
  }
}

header( $_SERVER[\'SERVER_PROTOCOL\'] . \' 404 Not Found\' );
header( \'Status:404\' );
die( \'404 Not Found\' )
中的重写.htaccess

  RewriteEngine on
  RewriteCond   %{REQUEST_FILENAME} !-d
  RewriteCond   %{REQUEST_FILENAME} !-f
  RewriteRule   (.*) index.php?token=$1 [QSA,L]

SO网友:fregante

这是我得到的最接近的。它使URL像您想要的那样工作:domain.com/123

// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( \'generate_rewrite_rules\', \'create_post_id_url\' );
function create_post_id_url( $wp_rewrite ) {
    $feed_rules = array(
        \'(\\d+)\' => \'index.php?p=\'.$wp_rewrite->preg_index(1)
    );
    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
将此添加到任意位置(例如functions.php), 转到Settings > Permalinks 然后Save.

这种方法唯一的问题是用户将继续domain.com/123 不会重定向到规范版本(domain.com/123/post-name). 这不是什么大问题,因为你已经有了canonical 中的链接<head> 所以这不是搜索引擎的问题。这实际上可以被认为是一种优势,因为用户不必等待重定向。

另一种选择是使用如下链接domain.com/?p=123. 它们只长3个字符,不会在服务器上添加任何负载-它们已经可以工作了。

最后,why do you even need short urls? 推特会自动缩短所有URL,我认为现在没有必要这样做,它们只会降低URL的可读性。

SO网友:palPalani

您可以使用以下htaccess rule 用于重定向domain.com/post-iddomain.com/post-id/post-slug.

RedirectMatch 301 ^/(\\d+)$ http://domain.com/?p=$1
将此规则置于WordPress的默认规则之上。

结束

相关推荐

Rewriting WordPress URLs

我有一个插件,它通过一个短代码通过GET请求获取输入。快捷码放在带有地址/搜索的页面上,用于执行此特定搜索的查询是/搜索/?VenuName=。这很好用。但是,我需要重写它,以便当用户转到/地点/时,它加载上述搜索。This gist 包含我的原始代码(失败),以及Pippin关于我应该在哪里的建议(也失败)。我已经尝试了我能想到的一切,它总是导致404错误,或者重定向到主页(这毫无意义)。我还尝试了通过Rewrite plugin, 结果是一样的。如果您能提供任何帮助,我们将不胜感激。不幸的是,我在这个