我正在尝试为我的帖子创建一个定制的永久链接结构。
www.example.com / post / %post_id% / %posttitle% /
在这个永久链接中,帖子的ID首先出现,然后是帖子的标题。
我现在知道的事情postname
通常存储在wp_posts
中的表post_name
行,并控制帖子的URL。ie:如果帖子post_name
是my-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为25当用户请求链接时
www.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
规则。
最合适的回答,由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现在来自帖子标题,可以编辑!