空格是URL中的无效字符。无论帖子是否存在,也不管你是否需要空格,你的链接都已断开。
大写/小写也会给你带来麻烦。某些服务器区分大小写,因此如果您有永久链接http://somesite.com/hello-world
像这样的链接http://somesite.com/Hello-World
可能有效,也可能无效。你不想让pages在这个案子上翻到404页,对吧?
你的代码内容不足,所以很难测试,但是。。。
$content = "(link: http://example.com/test )"; // assuming links like this
$post= \'Abc Def\'; // and assuming $post is the post title
$content = preg_replace(
\'%\\(link: ?(.*?) ?\\)%\',
\'(link: <a href="http://somesite.com/\'.sanitize_title_with_dashes($post).\'" title="\'.$post.\'">\'.$post.\'</a>)\',
$content
);
关于你的代码,我注意到了一些事情。
$post
是WordPress使用的全局变量。您似乎通过将其设置为帖子标题而不是将其保留为帖子对象来对其进行全局搜索。我建议使用不同的变量名在PHP中,变量不会在单引号内展开,因此代码中在单引号内包含变量的部分不会以您想要的方式打印出来。例如title="$post">$post</a>)\'
实际上是title="$post">$post</a>)\'
进一步思考,与其按照您尝试的方式将标题转换为永久链接,不如使用
$post->post_name
, 具有
$post
作为post对象,它应该是。WordPress最初像我那样将标题转换为永久链接,但标题可以独立于永久链接进行编辑。无法保证转换标题会起作用。
事实证明,真正的问题是如何捕获和转换用户提供的输入。为此你需要preg_replace_callback
.
function transform_pseudo_anchor_wpse_101201($match) {
if (isset($match[1])) {
return \'(link: <a href="http://example.com/\'.sanitize_title_with_dashes($match[1]).\'" title="\'.$match[1].\'">\'.$match[1].\'</a>)\';
}
}
$content = preg_replace_callback(
\'%\\(link: ?(.*?) ?\\)%\',
\'transform_pseudo_anchor_wpse_101201\',
$content
);
echo $content;