你好@Simon Blackbourn:
当我在写我的答案时,还没来得及发帖,@Bainernet也给出了一个很好的答案。他采取了稍微不同的方法,但他的作品和我的作品一样好。不过,既然我看到他的时候已经写了我的,我会把我的作为替代品提交给你考虑。
使用直接SQL:$post_id = $wpdb->get_var($sql)
我的解决方案使用的是直接SQL,这通常不是最好的方法,但我觉得这是公平的,因为这种SQL很简单(因此不太可能在将来中断),而且对于您的需要,使用相对较重的
get_posts()
由于您的需求对于特定站点来说是一次性的,所以它需要处理挂钩。
使用直接URL参数:$_GET[\'lid\']
此外,我选择使用直接访问
$_GET[\'lid\']
而不是首先创建
query_var
因为查询变量是基础URL重写系统使用的标准WordPress查询体系结构的一部分,并且对于您的用例,您明确没有利用WordPress查询体系结构。相反,您需要捕获传递到URL上的实际查询参数,因此我认为实际上不需要添加查询变量的开销(尽管使用查询变量不会有什么坏处,而且效果也很好)
使用\'parse_request\'
最后,我确实喜欢@Bainternet的使用\'parse_request\'
钩它在WordPress的默认MySQL查询之前运行,因此您不必运行您将丢弃的MySQL查询,而是在\'init\'
钩子意味着(大多数)允许插件修改永久链接的钩子将被添加,从而为重定向提供正确的URL。
放置在functions.php
您可以将以下代码放入主题的
functions.php
文件:
add_action(\'parse_request\',\'oldsite_redirect\',0); // 0=before (most) \'parse_request\' calls
function oldsite_redirect() {
if (isset($_GET[\'lid\'])) {
global $wpdb;
$sql = "SELECT post_id FROM {$wpdb->postmeta} " .
"WHERE meta_key=\'lid\' AND meta_value=\'%s\'";
$sql = $wpdb->prepare($sql,$_GET[\'lid\']);
$post_id = $wpdb->get_var($sql);
if ($post_id) {
$permalink = get_permalink($post_id);
if ($permalink) {
wp_safe_redirect($permalink,301);
exit;
}
}
}
}
同样,任何一种解决方案都会奏效@班特网或我的;您可以选择使用哪个。