固定链接独立于存储在数据库中的帖子名称

时间:2016-02-02 作者:Yazan W Yusuf

我正在尝试为我的帖子创建一个定制的永久链接结构。

www.example.com / post / %post_id% / %posttitle% /
在这个永久链接中,帖子的ID首先出现,然后是帖子的标题。

我现在知道的事情postname 通常存储在wp_posts 中的表post_name 行,并控制帖子的URL。ie:如果帖子post_namemy-post-name, 默认URL为www.example.com/post/my-post-name.

帖子名称以这样的方式存储在数据库中,即每个帖子都有一个唯一的帖子名称。如果两篇文章标题相同(例如new-advanced-topic), 第一个帖子的名字是new-advanced-topic 第二个帖子的名字是new-advanced-topic-2. 因此,URL将彼此不同。

我想要什么,但我不希望帖子的URL依赖于存储在数据库中的帖子名称。

我想要的结构类似于

www.example.com / post / %post_id% / %posttitle% /
假设数据库中存储了2篇带有这些值的文章

╔════╦════════════════════╦═════════════════════╗
║ ID ║     post_title     ║      post_name      ║
╠════╬════════════════════╬═════════════════════╣
║ 25 ║ new-advanced-topic ║ new-advanced-topic  ║
║ 26 ║ new-advanced-topic ║ new-advanced-topic2 ║
╚════╩════════════════════╩═════════════════════╝
我希望帖子的URL只取决于帖子的ID。因此如果用户请求www.example.com/post/25/pla-pla-pla, 将显示的帖子id为25www.example.com/post/{%post_id%}/pla-pla-pla, 我要WordPress将他重定向到www.example.com/post/{%post_id%}/{%post_title%}.因此,如果用户要求www.example.com/post/25/pla-pla-pla, WordPress会将他重定向到www.example.com/post/25/new-advanced-topic 并使用ID=25.

如果用户要求www.example.com/post/26/new-advanced-topic2, WordPress会将他重定向到www.example.com/post/26/new-advanced-topic 并使用ID=26.

如果用户要求www.example.com/post/100/new-advanced-topic, 他应该会看到404错误,因为数据库中没有用ID=100.

我试图写一个新的rewrite\\u规则来做到这一点,但我无法找到任何方法来写它的正则表达式。

如何使用wp_rewrite 规则。

2 个回复
最合适的回答,由SO网友:тнє Sufi 整理而成

我们必须这样做post_name 唯一的否则,可能会引起很多麻烦。我们可以使用post_title 具有sanitize_title. 通过这种方式,您可以保持URL整洁,并且post_name 也将保持独特性。

首先,我们需要编写定制的permalink结构。

function my_awesome_permalink( $url, $post, $leavename ) {
    $url= trailingslashit( home_url(\'/post/\'. $post->ID .\'/\'. sanitize_title($post->post_title) .\'/\' ) );
    return $url;
}
add_filter( \'post_link\', \'my_awesome_permalink\', 10, 3 );
现在,我们的定制permalink结构已经就绪。它将成为www.example.com/post/{%post_id%}/{%post_title%} e、 g.:www.example.com/post/25/my-awesome-post-title . 我们需要添加适当的重写规则,使WP理解并返回正确的帖子。

add_action(\'generate_rewrite_rules\', \'custom_rewrite_rules\');
function custom_rewrite_rules( $wp_rewrite ) {
    $new_rules[\'^post/([0-9]+)/([^/]+)/?\'] = \'index.php?p=$matches[1]\';
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
    return $wp_rewrite;
}
使用以上代码,您将能够使您的post permalink结构www.example.com/post/25/my-awesome-post-title 它将显示正确的帖子。

上述代码的一个问题是,您无法从post editor编辑post slug。但您的帖子url现在来自帖子标题,可以编辑!

SO网友:heshamhussain

我知道你想用什么post ID 而不是Post Title .

你会因为标题名称相同而遇到麻烦。

如果正确,解决方案如下:

1-更改permalinkcustom structure 如下图所示

enter image description here

2-转到phpmyadmin 并更改您的posts name 如下图所示

enter image description here

相关推荐

Force pretty permalinks?

我正在构建一个插件,该插件将用于单个站点,并依赖于add_rewrite_rule 要工作,需要打开永久链接。打开它们并不困难,因为它只是一个站点,但我担心其中一个管理员可能会在不知道自己在做什么的情况下关闭它,并破坏该站点。如何以编程方式强制保持漂亮的永久链接?