代码中有三个问题:
根据您的习惯wp_attachment_link()
函数,您应该使用post slug($attachment->post_name
) 而不是简单地更换
(空白)带-
(破折号)在帖子标题中-注意,生成的slug可能与实际slug不同,例如标题可能是My Image
实际段塞为my-image-2
, 然而你的str_replace()
-ing将导致my-image
.
在重写规则中,没有$matches[2]
, 只有$matches[1]
与<slug>
如中所示example.com/photos/<slug>
.
同样在该规则中,查询无效:您应该使用attachment
参数和notattachment_id
, 所以正确的答案是attachment=$matches[1]
.
这样可以帮助您修复自己的代码,或者您可以尝试我的代码:
add_filter( \'attachment_link\', \'wp_attachment_link\', 20, 2 );
function wp_attachment_link( $link, $attachment_id ) {
if ( ! $slug = get_post_field( \'post_name\', $attachment_id ) ) {
return $link; // you should just do this if the slug is empty..
}
return home_url( user_trailingslashit( "/photos/$slug", \'single\' ) );
}
// Rewrite attachment page link.
add_action( \'init\', function() {
add_rewrite_rule( // wrapped for brevity
\'^photos/([\\w\\-]+)/?$\',
\'index.php?attachment=$matches[1]\',
\'top\'
);
} );
别忘了刷新重写规则;只需访问permalink设置管理页面(
wp-admin
→ 设置→ Permalinks)。此外,您应该使用唯一的函数名,而不是wp\\u attachment\\u link,例如,使用my\\u prefix\\u attachment\\u link:)